由于服务器是运行在docker环境中,直接运行PHP命令会抛以下异常:
php think xxx
Could not open input file: think即使用了它对应命令行的php文件来执行,也会抛一个诡异的问题:
进入docker中执行命令,直接进入执行也会报各种错:
这是因为默认的环境未配置各种动态链的绑定,需要加载绑定的命令
解决问题:
参考小皮面板提供的webshell,点击composer, 它默认进入docker后,还进行了各种动态链的绑定,只需要把这些命令一起拿出来就行了
进入docker执行命令如下:
docker exec -i centos_env /bin/bash -c "命令脚本"
我们将上方截图中的命令拼接在一起, 再加上我们需要执行的php命令:
docker exec -it centos_env /bin/bash -c "ln -sf /usr/local/phpstudy/soft/composer/composer-1.6/composer.phar /usr/bin/composer && ln -sf /usr/local/phpstudy/soft/php/php-7.2.21/bin/php /usr/bin/php && export LD_LIBRARY_PATH=/usr/local/phpstudy/soft/php/php-7.2.21/sbin/depends && php /项目路径/think 命令"
我们直接在xshell中可以执行,放在服务器的crontab中有没有效果呢?
我们通过监听crontab执行后邮件通知日志查看结果:
tailf /var/mail/root
发现还是抛了一个异常: the input device is not a TTY
经过检查发现docker进入容器的命令多了个参数:
docker exec -it
-t 是指会生成一个伪终端,作用是我们用xshell操作时, 能够生成一个伪终端让我们能够直接操作linux命令,所以在上面说过,直接运行是可以的,但是如果是后台定时,需要去掉-t
最终参数如下:
docker exec -i centos_env /bin/bash -c "ln -sf /usr/local/phpstudy/soft/composer/composer-1.6/composer.phar /usr/bin/composer && ln -sf /usr/local/phpstudy/soft/php/php-7.2.21/bin/php /usr/bin/php && export LD_LIBRARY_PATH=/usr/local/phpstudy/soft/php/php-7.2.21/sbin/depends && php /项目路径/think 命令"
完美解决