我的托管服务器上有一个cron job应该php每 30 分钟执行一个脚本。该php脚本用于废弃csv文件并将该数据更新到数据库中(我使用 MySQL 来实现)。当手动执行该脚本时,该脚本将起作用 - 它需要它45 seconds才能完成该过程。
现在,当它cron job运行时,我收到以下消息:
Could not open input file.
Run Code Online (Sandbox Code Playgroud)
起初我认为这可能是因为执行该脚本需要超过 30 秒,所以我决定在 php 脚本开始时设置最大执行时间:
ini_set('max_execution_time', 300);
Run Code Online (Sandbox Code Playgroud)
但同样的消息又出现了。这是我的cron job:
/usr/local/bin/php /home/emmaein/domain.com/folder/script.php?token=d8cn3j
Run Code Online (Sandbox Code Playgroud)
PS:该tokenget 变量有点像密码,因此每个人都不能执行它,所以基本上我的php脚本如下所示:
if($_GET['token'] === 'd8cn3j'){
//open csv
//get data
//update db
} else{
exit('I see you >:)');
}
Run Code Online (Sandbox Code Playgroud)
当 PHP 不在 Web 服务器内运行时,您无法访问$_GET变量(不存在这样的事情)。相反,您应该使用命令行参数:
<?php
if ($argc > 1 && $argv[1] === 'd8cn3j') {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
然后你的 crontab 就变成了:
/usr/local/bin/php /home/emmaein/domain.com/folder/script.php d8cn3j
Run Code Online (Sandbox Code Playgroud)
$argc(参数数量)和$argv(参数数组)的概念在 CLI 程序中相当标准,并且在 PHP 网站上有记录。