Laravel Cron php_network_getaddresses:getaddrinfo失败

你好!

所以我有这个烦人的问题,为Laravel调度设置一个cron作业。 要了解这个问题,下面是项目架构:

  • 该项目使用docker(我们有一个PHP的容器,MySQL和Nginx的容器)
  • 该Web应用程序build立在Laravel 5.3上

我们想要自动化一些任务,所以我们创build了3个命令,并且将它们在日程安排中进行收集,以便每天运行它们,下面是kernel.php样子:

  protected $commands = [ 'App\Console\Commands\IncompleteAccount', 'App\Console\Commands\TirageSoon', 'App\Console\Commands\WinzExpiration', ]; protected function schedule(Schedule $schedule) { $schedule->command('incompleteaccount:run')->everyFiveMinutes()->sendOutputTo(storage_path('logs/cron.log')); $schedule->command('tiragesoon:run')->everyFiveMinutes()->sendOutputTo(storage_path('logs/cron.log')); $schedule->command('winzExpire:run')->everyFiveMinutes()->sendOutputTo(storage_path('logs/cron.log')); } 

我们的crontab看起来像:

 * * * * * php /var/www/artisan schedule:run >> /var/www/storage/logs/cron.log 2>&1 

在日志文件中我们得到这个:

  [Illuminate\Database\QueryException] SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from `booking` where `created_at` > 2017-08-27 16:08:50) [Doctrine\DBAL\Driver\PDOException] SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known [PDOException] SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known [PDOException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known No scheduled commands are ready to run. No scheduled commands are ready to run. No scheduled commands are ready to run. No scheduled commands are ready to run. 

最后.env文件看起来像:

 APP_ENV=prod APP_KEY=base64:gPDQqknmG9YSOMueb/Ii0xXWQvrzOPsVFVRHVIzXXD0= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://www.ourSite.com DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=ourDB DB_USERNAME=homestead DB_PASSWORD=secret BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file 

另外,我可以从我的容器中ping到mysql,这里是docker撰写文件:

 version: '2' services: volumes_source: image: tianon/true volumes: - ${SRCDIR}:/var/www - ${DATADIR}/data/uploads:/var/www/public/img/uploads nginx: image: nginx volumes_from: - volumes_source volumes: - ${SRCDIR}/dockers/etc/nginx/sites-enabled:/etc/nginx/sites-enabled - ${SRCDIR}/dockers/etc/nginx/nginx.conf:/etc/nginx/nginx.conf ports: - "${HTTP_PORT}:80" links: - php:phpfpm wait: image: aanand/wait links: - mysql:mysql ### Workspace Utilities Container ########################### php: build: dockers/winsu volumes_from: - volumes_source command: php-fpm7 -F working_dir: /var/www environment: CONFIG_ENV: ${CONFIG_ENV} entrypoint: /var/www/dockers/winsu/run.sh volumes: - ${SRCDIR}/dockers/winsu/crontab:/crontab.file links: - mysql:mysql - wait:wait ### MySQL Container ######################################### mysql: image: mysql volumes_from: - volumes_data environment: MYSQL_DATABASE: winsu MYSQL_USER: homestead MYSQL_PASSWORD: root MYSQL_ROOT_PASSWORD: root ### Databases Data Container ################################ volumes_data: image: tianon/true volumes: - ${DATADIR}/data/mysql:/var/lib/mysql - ${DATADIR}/data/storage:/var/www/storage 

到目前为止,已经面临这个问题3天! 如果你能帮上忙,真的会很感激! 我已经看到类似的问题,但没有任何工作! 提前致谢 :)

您的问题似乎与环境variables没有被拾起有关。 当你在cron中运行一个命令时,两件事情是不同的

  • 当前工作目录
  • 环境variables

所以改变你的命令

 * * * * * cd /var/www && /var/www/artisan schedule:run ... 

并使用在命令之前加前缀的X = Y格式来定义任何其他所需的variables

 * * * * * cd /var/www && X=YZ=A /var/www/artisan schedule:run ... 

你可以尝试使用工匠来certificate你的代码。

在PHP的工匠commant你可以把一个-v | vv | vvv,–verbose增加消息的详细程度:1为正常输出,2为更详细的输出和3debugging

例如,你可以做:

 php artisan incompleteaccount:run -v 

如果代码有错误,使用此代码,该命令将返回错误信息以及有关该代码的所有信息。