1

Laravel/Lumen を使用しています。SMS を送信する簡単なジョブをセットアップしました。

<?php

namespace App\Jobs;

class SendDepositSMSAlertJob extends Job
{
    private $numbers;
    private $account;
    private $type;
    private $amount;
    private $date;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($account, $type, $amount, $date, $numbers)
    {
        $this->numbers = $numbers;
        $this->account = $account;
        $this->type = $type;
        $this->amount = $amount;
        $this->date = $date;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        foreach ($this->numbers as $number) {
            // Settings
            $url = "https://api.xxxxx.com/v3/messages/send";
            $from = "XX";
            $message = urlencode($this->account." has been credited with a " . $this->type . " deposit of GHs " . $this->amount . " on " . $this->date);

            $client_id = "xxxxxx";
            $client_secret = "xxxxxxx";
            $query_string = "?From=".$from."&To=".$number."&Content=".$message."&ClientId=".$client_id."&ClientSecret=".$client_secret."&RegisteredDelivery=true";

            $response = @file_get_contents($url.$query_string);
        }
    }
}

コントローラーにレコードが保存されるたびに、ジョブをディスパッチします。

$this->dispatch(new SendDepositSMSAlertJob($bank . ' - ' . $acNumber, $depositType, $depositAmount, $reportDate, $telNumbers));

これで、kernel.php に次の設定ができました。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \JK\Dingo\Api\Console\Commands\RouteListCommand::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // Run once a minute
        $schedule->command('queue:work')->everyMinute()->withoutOverlapping();
    }
}

私の cPanel には、次の cron ジョブが設定されています。

php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan schedule:run

上記のコマンドは、毎分実行するように設定されています。

問題 この設定がうまくいきません。Bluehost VPS では、サーバーが何度もクラッシュし、再起動を余儀なくされました。どうやらメモリを大量に消費していたようで、その理由がわかりません。サポートも役に立ちませんでした。はっきりさせておきますが、うまくいきましたが、サーバーが少なくとも 1 日に 2 回クラッシュしました。

それで、それが私のホスティングと関係があると思って、別の場所(SiteGround)で別のホスティングを購入しました。現在、cronを機能させることさえできません。cron が実行されるたびに、これが私のメールに送信されます。

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Resource temporarily unavailable' in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php:941
Stack trace:
#0 [internal function]: Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(2, 'proc_open(): fo...', '/home/abc17060/...', 941, Array)
#1 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(941): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(729): Symfony\Component\Console\Application->getSttyColumns()
#3 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(690): Symfony\Component\Console\Application->getTerminalDimensions()
#4 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(623): Symfony\Component\Console\Application->getTerminalWidth()
#5 /home/xxxxx/xxxxx/vendor/laravel/lumen-framework/src/Exceptions/Handler.php(147): Symfony\Component\Console\Application->renderException(Object(ErrorException),  in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php on line 941


Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Resource temporarily unavailable' in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php:941
Stack trace:
#0 [internal function]: Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(2, 'proc_open(): fo...', '/home/abc17060/...', 941, Array)
#1 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(941): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(729): Symfony\Component\Console\Application->getSttyColumns()
#3 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(690): Symfony\Component\Console\Application->getTerminalDimensions()
#4 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(623): Symfony\Component\Console\Application->getTerminalWidth()
#5 /home/xxxxx/xxxxx/vendor/laravel/lumen-framework/src/Exceptions/Handler.php(147): Symfony\Component\Console\Application->renderException(Object(Symfony\Component in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php on line 941

今、私はこれを引き起こしているのか、それを修正する方法がわかりません。ドキュメントのすべての指示に従っていると思いますが、ここで何が間違っているのかわかりません。私は調査を行い、両方のホスティング会社のサポートに連絡しましたが、それでも...

これがサポートからの最後のメッセージでした。

cron を数回実行しようとしましたが、実行するスケジュールされたコマンドがありません。

xxxxxx@c27664 [~/xxxxx]# php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan schedule:run
No scheduled commands are ready to run.

また、制限をもう一度増やしました。スクリプトの実行に 300 秒を設定し、memory_limit を 2048MB に設定しました。

もう一度お試しください。サポートが必要な場合は、お気軽にチケットを更新してください。

ルーメンとジョブに何か問題がありますか? ここで何が起こっているのか、Laravel 5.1でコマンドを正常に実行しました。

または、cron 経由で通常の PHP を使用してこのスクリプトを実行できる、より簡単で効率的な方法がある場合は、その方法を教えてください。

4

1 に答える 1