【问题标题】:Check if php script was called by the server or remotely in php?检查php脚本是由服务器调用还是在php中远程调用?
【发布时间】:2017-09-25 22:13:06
【问题描述】:

我有一个 crontab php 脚本,它位于 abc.tld 上的一个文件夹中。 问题是脚本也可以通过直接调用来触发(即http://abc.tld/crontab.php) 为了消除这种可能性,我想,我可以做类似的事情

if( isset($_SERVER['REQUEST_METHOD']) || isset($_SERVER['REMOTE_ADDR']) )
     die( 'Never gonna happen!' );

但是正确的方法是什么? (.htaccess 除外)

crontab 条目:

0 12 * * 1  /usr/local/bin/php /home/pavellebedev/public_html/abc.tld/wp-content/plugins/easy-timesheet/kernel/cron/ezts_timesheet_notifications.php

【问题讨论】:

标签: php .htaccess cron superglobals


【解决方案1】:
if(php_sapi_name() == 'cli') {
    // Called from command-line, maybe cron
} elseif(php_sapi_name() == 'apache2handler') {
    // Called from the apache2 webserver upon web request
}

文档:http://php.net/manual/en/function.php-sapi-name.php

【讨论】:

    【解决方案2】:

    作为我从 Calimero 的回答扩展而来的研究结论,这是确保脚本被 crontab (php 5.3+) 调用的最可靠方法:

    if( stripos(php_sapi_name(), 'cgi') === false || stripos(php_sapi_name(), 'cli') === false ) die('Not cron');
    

    【讨论】:

    • 您能否偶然在您的问题中发布 crontab 条目?仅当您将 CGI php 作为 CLI 运行时,您的答案才有意义(虽然有点不方便),或者如果 cron 作业是发生在运行 CGI php 的网络服务器的 curl 请求。我过早放弃了这些案例,我很乐意相应地更新我的答案。
    • 刚刚做了,我的 sapi 返回 cgi_fcgi
    • 实际上实验表明你是对的,@Calimero,Php.net 一定弄错了(?)我已经编辑了我的答案,因为服务器端的另一个非 cron 脚本调用脚本导致“cgi”
    【解决方案3】:

    重复How to check if a php script is being called by another script on the server?

    答案:

    当从服务器调用脚本时,为您提供发出请求的客户端 IP 地址的 $_SERVER["REMOTE_ADDR"] 变量应该是 127.0.0.1

    【讨论】:

    • 错误。通过 CLI 运行 php 脚本时未设置 $_SERVER["REMOTE_ADDR"]
    • 哦,是的,我只是在考虑 php 文件仅供网络使用的可能性,我的错
    • 不要复制/粘贴其他问题的答案。如果您找到一个可以回答此问题的问题,则应将其标记为重复(如果您没有代表将其标记为重复,只需留下评论即可)。
    • 为什么有人赞成这个?这是错误的,因为它没有回答问题,任何人也不应该从其他帖子中复制/粘贴答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多