رفع خطای curl_multi_init در پرستاشاپ ۸ و بالاتر

دانوش میرعلایی
1404-08-06 17:03:55
14

مشکل غیرفعال بودن curl_multi_init

گاهی هنگام نصب یا پس از نصب یا به‌روزرسانی پرستاشاپ ۸، ممکن است با خطایی مواجه شوید که اجرای سایت را متوقف می‌کند و مربوط به کتابخانه‌ی HttpClient است. این خطا معمولاً به دلیل غیرفعال بودن یکی از توابع داخلی PHP به نام curl_multi_init رخ می‌دهد. در این مقاله به‌صورت خلاصه و کاربردی توضیح می‌دهیم که چگونه می‌توانید این مشکل را در سرور یا هاست خود رفع کنید.

 شرح خطا

Attempted to call function "curl_multi_init" from namespace "SymfonyComponentHttpClientInternal"
in CurlClientState.php line 43

این خطا به این معنی است که تابع curl_multi_init() در PHP غیرفعال یا مسدود شده است. پرستاشاپ از کتابخانه‌ی Symfony HttpClient استفاده می‌کند که برای ارسال درخواست‌های HTTP، به این تابع نیاز دارد.

علت بروز خطا

  • در فایل تنظیمات PHP (php.ini) تابع curl_multi_init در لیست disable_functions قرار گرفته است.
  • در هاست اشتراکی، مدیر سرور برای افزایش امنیت، این تابع را مسدود کرده است.

روش اول (سرور): فعال‌سازی تابع در php.ini

  1. فایل php.ini را باز کنید.
  2. دنبال خط زیر بگردید:
    disable_functions = curl_multi_init, exec, system, ...
    
  3. مقدار curl_multi_init را از لیست حذف کنید
  4. سپس وب‌سرور را ری‌استارت کنید
  5. حالا پرستاشاپ بدون خطا اجرا می‌شود.

 روش دوم (هاست اشتراکی): استفاده از NativeHttpClient در صورت محدودیت هاست

اگر در هاست اشتراکی هستید و اجازه فعال‌سازی تابع را ندارید، می‌توانید پرستاشاپ را وادار کنید به‌جای CurlHttpClient از NativeHttpClient استفاده کند (که به curl_multi_init نیازی ندارد).

برای این کار فایل زیر را ویرایش کنید:

/vendor/symfony/symfony/src/Symfony/Component/HttpClient/HttpClient.php

بخش مربوط به متد create() را به شکل زیر تغییر دهید:

 public static function create(array $defaultOptions = [], int $maxHostConnections = 6, int $maxPendingPushes = 50): HttpClientInterface
    {
        if (extension_loaded('curl') && function_exists('curl_multi_init')) {
            if ('' !== DIRECTORY_SEPARATOR || isset($defaultOptions['cafile']) || isset($defaultOptions['capath']) || ini_get('curl.cainfo') || ini_get('openssl.cafile') || ini_get('openssl.capath')) {
                return new CurlHttpClient($defaultOptions, $maxHostConnections, $maxPendingPushes);
            }

            @trigger_error('Configure the "curl.cainfo", "openssl.cafile" or "openssl.capath" php.ini setting to enable the CurlHttpClient', E_USER_WARNING);
        }

        return new NativeHttpClient($defaultOptions, $maxHostConnections);
    }

✅ با این تغییر، حتی در صورت غیرفعال بودن تابع curl_multi_init، سایت به درستی کار می‌کند.

جمع‌بندی

وضعیت سرورراه‌حل پیشنهادی
دسترسی به php.ini داریدتابع curl_multi_init را فعال کنید
هاست اشتراکی و تابع غیرفعال استویرایش HttpClient.php و استفاده از NativeHttpClient
(1 رای)
5 5 1 1