我使用Laravel / Lumen。我已经设置了一个简单的工作来发送短信:
<?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上,它导致我的服务器多次崩溃,迫使我重新启动。显然它吃了太多的记忆,我不明白为什么,支持无法帮助我。让我澄清一下,它起作用但导致我的服务器每天至少崩溃两次。
所以认为它与我的托管有关,我在其他地方购买了另一个托管(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 执行脚本的秒数和2048MB memory_limit。
请再试一次,如果您需要任何帮助,请不要犹豫 更新机票。
流明和工作有什么问题吗?我在Laravel 5.1中成功运行了命令。这里发生了什么。
或者,如果有一个更简单或有效的方法,我可以使用常规PHP通过cron执行此脚本,请告诉我如何。
答案 0 :(得分:0)
queue:work
命令旨在作为守护程序运行。在laravel cron任务中运行基本上会使它的占用空间增加一倍。
在共享主机上以守护程序模式运行它可能很棘手,并且100%取决于cPanel允许您执行的操作。如果您有权使用“ supervisord”,则可以通过关注setting it up上的Laravel文档来实现魔术。
如果您无法将其设置为共享主机上的守护程序,则可以尝试直接从控制面板的CRON运行器运行queue:work
,而不是将其包装在Laravel CRON中。
php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan queue:work --once
这将运行它,处理队列中的一项并退出。它不会像守护进程那样快,但是它应该可以工作。
您始终可以从命令行(您可以访问)运行队列,并对其进行监视以确保它甚至可以工作。
php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan queue:work
将其作为前台进程运行,您可以观察它是否有任何作用。
希望这里有些帮助。