我正在运行一个需要将数据写入缓存的cronjob.我想把这个cronjob放在我的私人文件夹中,但是,即使在CHMODding私人文件夹中的缓存文件夹之后,它也没有获得写权限.这似乎是一些plesk功能.
所以,现在我把cronjob放在公共文件夹中.但是,我需要确保只有服务器才能执行脚本.在cronjob顶部的下面怎么样?
if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die();
这似乎有效.然而,它是否不可开发,例如.用户可以操纵他的remote_addr到我的服务器吗?或者有更好的方法来检查这个?
我遇到的另一个问题是上面的代码返回2个警告,即使它似乎确实有效:
PHP Notice: Undefined index: SERVER_ADDR in ... on line 2 PHP Notice: Undefined index: REMOTE_ADDR in ... on line 2
知道是什么原因造成的吗?
通过控制台而不是Web服务器执行脚本.
cron看起来像这样:
*/5 * * * * php -f /path/to/cron.php
然后该文件可以这样做:
cron.php:这将保证它只由服务器运行.
编辑以回应评论
通常,您无法访问私有文件夹中的公用文件夹,如果无法在Web根目录之外添加新目录,则必须以另一种方式保护缓存目录.
我将假设您的所有文件都在Web根目录中,即:
/home/site/publichtml
.用你的目录替换它.创建一个新目录
/home/site/publichtml/.cache
.将以下内容添加为.htaccess文件:Deny from all现在,您的脚本应该能够从文件系统访问该文件夹,但它无法通过Web服务器访问.
如果你可以在服务器上设置一个cron作业(通过网络管理员或其他方式,听起来像你可以的话),如上所述,即:
php -f /home/site/publichtml/cron.php
用作命令,并包括对数组键的检查.或者,您可以这样检查:
if ( !isset($_SERVER['argc']) ) die("Must be run from the command line!\n");
$_SERVER['argc']
仅在从命令行执行脚本时设置.如果你可以将cron脚本保留在web根目录之外,那就好了.如果没有,那应该是安全的.
最后,要摆脱E_NOTICES,将其添加到cron.php的顶部:
error_reporting(E_ALL ^ E_NOTICE); // Turn off notices要么
error_reporting(0); // Hide all error reporting