搬到新服务器后我遇到了一个奇怪的问题。用于获取邮件的 cron 会检查授权 IP,其中之一默认为 127.0.0.1
移动后它停止工作,因为 REMOTE_ADDR 变量未填充。它是从浏览器调用时调用的,但不是从 cron 内部运行或使用 php 从控制台运行时调用的。我转储了 $_SERVER 变量,这就是 cron/console 中的所有内容
(
[SHELL] => /bin/sh
[MAILTO] => *removed*
[USER] => *removed*
[PATH] => /usr/bin:/bin
[PWD] => /home/*removed*
[SHLVL] => 1
[HOME] => /home/*removed*
[LOGNAME] => *removed*
[_] => /usr/local/bin/php
[PHP_SELF] => /home/*removed*/public_html/support/cron.php
[SCRIPT_NAME] => /home/*removed*/public_html/support/cron.php
[SCRIPT_FILENAME] => /home/*removed*/public_html/support/cron.php
[PATH_TRANSLATED] => /home/*removed*/public_html/support/cron.php
[DOCUMENT_ROOT] =>
[REQUEST_TIME] => 1300522141
[argv] => Array
(
[0] => /home/*removed*/public_html/support/cron.php
)
[argc] => 1
)
if(!$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
echo sprintf("[ERROR]: Your IP %s is not authorized to run scheduled tasks. Please notify your administrator.",
$_SERVER['REMOTE_ADDR']
);
// [JAS]: Test all our IPs for a wildcard match
if(is_array($this->valid_ips))
foreach($this->valid_ips as $mask) {
if(empty($mask)) continue;
if(0 == strcmp(substr($ip,0,strlen($mask)),$mask)) {
return true;
}
The $_SERVER['REMOTE_ADDR']
由于 Apache 从命令行运行,所以填充了该变量,该变量以及许多其他变量都不会被设置。
另外,即使设置了,REMOTE_ADDR 也将始终是运行 cron 的计算机的本地 IP,因为您无法远程运行它。
[edit]
为了保持一致性,这里有一个使用 php_sapi_name 的示例
if(php_sapi_name() === 'cli') {
// You're running locally from the CLI
} else {
// You're running remotely, check against list of authorized ip addresses.
}
就您而言,您可以将 if 更改为:
if(php_sapi_name() != 'cli' && !$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)