如何仅从 cron 运行 php 脚本,或者是否可以检查请求是否来自 cron?
编辑
我正在尝试使用参数调用 php 文件。但它们都不起作用:
php -q /home/domain/public_html/cronjob.php?i=a
php -q /home/domain/public_html/cronjob.php par1
php -q /home/domain/public_html/cronjob.php par1=a
php -q /home/domain/public_html/cronjob.php par1='a'
我无法使用 $_GET、$_SESSION 或 $argv。如何使用参数调用文件?
如果您问这个问题是因为您需要检查脚本是否不是从网络请求调用,您可以使用
php_sapi_name
函数来查看调用方法 - 如果是 cron 作业,则该函数应该返回 cli
表示命令行调用。然而,它并不能帮助区分 cron 作业和常规命令行调用。
如果您还需要区分 cron 作业和脚本的命令行调用,您可以检查运行脚本的用户,看看它是否与运行 cron 作业的用户相同。例如,可以在 *nix 系统上使用
posix_getuid
或 posix_getlogin
函数来完成。
最后,如果您担心有人以 cron 作业所有者身份登录并从命令行运行脚本,您应该使用没有 shell 的单独用户来执行 cron 作业。
您可以将一个参数传递给您的脚本,表明它是在 cron 作业中调用的。 看一下问题:cron-jobs-calling-a-php-script-with-variables
如何将一些身份验证密钥传递给您的脚本,该密钥仅存储在 cron_script 和接收器脚本中。通话时检查 authkey 是否通过接收器脚本中的 $_GET['auth_key'] 传输。
喜欢:http://www.example.com/receiver_script.php?auth_key=“WhatEverYouWant”
好吧,我找到了解决方案。如果你想使用 GET 参数调用 php 文件,你应该这样调用文件:
php -q /home/domain/public_html/cronjob.php name=value
您可以使用 $_GET 在 php 文件中获取此数据:
$_GET['name']
或argv:
$argv[1]
如果您想将参数传递给 argb :
php -q /home/domain/public_html/cronjob.php value
我在网站上找到的其他示例不起作用,但这些效果很好..
您可以将客户端IP地址与服务器IP地址进行比较,也可以在CronJob地址中使用令牌,如下所示:
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$token = 'YOUR_UNQUIE_TOKEN';
if($ip == $_SERVER['SERVER_ADDR'] && (isset($_GET['token']) && $_GET['token'] === $token)){
// ---- your-cronJob-code----
}