Envoirnment:Linux,PHP
场景:我编写了一个将被设置为cron的脚本.现在的情况是,我希望脚本只能通过cron而不是通过任何浏览器(包括移动浏览器的任何Web浏览器)运行.所以我正在寻找像browserValidate这样的函数.
该脚本是用MVC框架编写的,将作为
/usr/bin/GET http://xyz.com/abc/pqr
Run Code Online (Sandbox Code Playgroud)
请帮我解决一下这个.
提前致谢.
正如@Mob所说,实现这一目标的确定方法是将脚本放在无法通过Web服务器访问的位置.如果无法做到这一点,或者由于某种原因您不想这样做,则需要检测脚本是通过Web服务器还是通过命令行调用的.
我最喜欢的方法(有很多)是:
$isRunningFromBrowser = !isset($GLOBALS['argv']);
Run Code Online (Sandbox Code Playgroud)
这意味着如果$isRunningFromBrowser为true,则只需退出/返回错误消息/等等.
从crontab中执行脚本时,您可以使用$_SERVERsuperglobal来检查Apache生成的条目(HTTP_*)或 - 因为$_SERVER反映了执行二进制文件的环境 - 在执行之前定义某个环境变量:
# in the crontab
FOOVAR=1 /usr/bin/php5 script.php
Run Code Online (Sandbox Code Playgroud)
然后,在script.php中,检查是否FOOVAR存在:
if (!isset($_SERVER['FOOVAR']))
die('No browser access.');
Run Code Online (Sandbox Code Playgroud)
如果您的cronjob正在执行wget并且客户端IP是服务器,则可以将其添加到.htaccess文件中:
SetEnvIf Remote_Addr "192.168.0.1" FOOVAR=1
Run Code Online (Sandbox Code Playgroud)
FOOVAR仅当客户端的IP地址为"192.168.0.1"时才会设置此项.