Cronjob脚本调用:PHP解释器(CLI)、curl还是wget?

Cronjob脚本调用:PHP解释器(CLI)、curl还是wget?,php,curl,cron,wget,Php,Curl,Cron,Wget,假设我想定期执行PHP脚本,例如/home/user/refresh.PHP,我看到了几个设置cronjob的选项: # Option A: PHP interpreter */15 * * * * php-cgi /home/user/refresh.php # Option B: curl */15 * * * * curl -L -s 'http://host.com/refresh.php' # Option C: wget */15 * * * * wget -q --spider

假设我想定期执行
PHP
脚本,例如
/home/user/refresh.PHP
,我看到了几个设置cronjob的选项:

# Option A: PHP interpreter
*/15 * * * * php-cgi /home/user/refresh.php

# Option B: curl
*/15 * * * * curl -L -s 'http://host.com/refresh.php'

# Option C: wget
*/15 * * * * wget -q --spider http://host.com/refresh.php

除了PHP不需要URL之外,还有什么区别?是否有性能方面的考虑?通常哪条路最好?我发现的唯一一个问题不是很详细,我想建立一些好习惯或最佳实践。

主要区别在于调用脚本的用户帐户的安全访问。对于示例B和C,安全上下文作为web服务器用户帐户执行。例如,它属于crontab所有者。如果您将选项A与此脚本的专用帐户一起使用,那么您将获得更细粒度的访问控制,因为Web服务器可能具有其他安全约束要求/扩展访问


其次,由于您将此脚本托管在的Web服务器上,因此您打开了更多的访问权限来触发该脚本。如果希望提供更方便的访问来运行脚本,那么这很好。否则,它不仅不那么安全,而且效率也不高,因为如果主动侦听web服务器还没有用于其他目的,那么运行该服务器也会带来内存/处理器开销。

这里有一个明确的答案:这取决于。您的脚本是否需要适当的CGI环境(
$\u SERVER
vars),或者脚本是否与web调用完全隔离?如果是这样,最好是直接调用解释器。否则wget/curl就没什么区别了(事实上,
netcat
可以做到)。如果是我,并且这个脚本应该是私有的,我会将它存储在web根目录之外,并使用选项a来确保只有我自己在使用它,如果它是私有的,就没有必要向公共web公开它。你永远不知道谷歌机器人是否会为它编制索引!标题是“CLI”,但crontab摘录使用了“PHPCGI”。标题是对的。如果作为命令行运行,请不要使用PHP的CGI版本。使用CLI版本;在您的系统上,它可能被称为
php