در این مقاله نحوه حل مشکل ارسال ایمیل از هاست های اشتراکی در لاراول نسخه 5 و بالاتر را با ارائه اخطار proc_close بدون درخواست کمک از رویس دهنده خود شرح خواهیم داد.

با توجه به تعداد بالای کاربران در سرور، شرکت های ارائه دهنده هاست اشتراکی مجبور به اعمال محدودیت هستند.

یکی از این محدودیت ها بستن سرویس proc-close است.

لاراول در فرآیند ارسال ایمیل از این سرویس استفاده می کند متاسفانه به دلیل بسته بودن این سرویس بر روی هاست های اشتراکی، پس از ارسال ایمیل با هشدار زیر مواجه می شویم:

ErrorException (E_WARNING)
proc_close() has been disabled for security reasons

نحوه برطرف کردن اخطار proc_close

متاسفانه تمامی توسعه دهندگان لاراول که پست یا مقاله ای در این زمینه منتشر کرده اند معتقدند سرور شما باید این گزینه را اجازه دهد اما راه حلی وجود دارد که می تواند با تغییرات بسیار کوچک بر این مشکل فائق آید.

بخوانید  چگونه سئو سایت کسب وکار شما را متحول می کند

برای حذف اخطار proc_close ابتدا مسیر زیر را در پوشه لاراول خود مرور کنید:

laravel/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php

فایل StreamBuffer.php را در یک ویرایشگر باز کنید (مهم نیست کدام ویرایشگر باشد) و به دنبال کد زیر بگردید:

/**
     * Perform any shutdown logic needed.
     */
    public function terminate()
    {
        if (isset($this->stream)) {
            switch ($this->params['type']) {
                case self::TYPE_PROCESS:
                    fclose($this->in);
                    fclose($this->out);
                    proc_close($this->stream);
                    break;
                case self::TYPE_SOCKET:
                default:
                    fclose($this->stream);
                    break;
            }
        }
        $this->stream = null;
        $this->out = null;
        $this->in = null;
    }

خوب، حالا کافی است نظر بدهید یا proc_close را حذف کنید (نظر بدهید تا بعداً به آن دسترسی پیدا کنید)

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

/**
     * Perform any shutdown logic needed.
     */
    public function terminate()
    {
        if (isset($this->stream)) {
            switch ($this->params['type']) {
                case self::TYPE_PROCESS:
                    fclose($this->in);
                    fclose($this->out);
                    //proc_close($this->stream);
                    break;
                case self::TYPE_SOCKET:
                default:
                    fclose($this->stream);
                    break;
            }
        }
        $this->stream = null;
        $this->out = null;
        $this->in = null;
    }

خب دوستان مشکل شما به همین سادگی حل می شود و دیگر این هشدار را نخواهید دید.

بخوانید  چگونه یک نام دامنه مناسب و جذاب انتخاب کنیم؟

امیدوارم این راهنما برای شما مفید بوده باشد.