如何检查服务器是否正在执行PHP脚本?

如何检查服务器是否正在执行PHP脚本?,php,Php,我正在运行一个cronjob,它需要将数据写入缓存。我想把这个cronjob放到我的私有文件夹中,但是,即使在私有文件夹中对缓存文件夹进行了chmoded之后,它也没有写入权限。这似乎是一种蛇形特征 现在,我将cronjob放在了公共文件夹中。但是,我需要确保只有服务器可以执行脚本。作业顶部的以下内容如何 if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die(); 这似乎奏效了。但是,它是否不可利用,例如,用户是否可以操纵其到我

我正在运行一个cronjob,它需要将数据写入缓存。我想把这个cronjob放到我的私有文件夹中,但是,即使在私有文件夹中对缓存文件夹进行了chmoded之后,它也没有写入权限。这似乎是一种蛇形特征

现在,我将cronjob放在了公共文件夹中。但是,我需要确保只有服务器可以执行脚本。作业顶部的以下内容如何

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die();
这似乎奏效了。但是,它是否不可利用,例如,用户是否可以操纵其到我的服务器的远程地址?还是有更好的方法来检查这一点

我遇到的另一个问题是,上面的代码返回了2个警告,尽管它看起来确实有效:

PHP Notice:  Undefined index:  SERVER_ADDR in ... on line 2
PHP Notice:  Undefined index:  REMOTE_ADDR in ... on line 2

知道这是什么原因吗?

首先,我会将可执行PHP脚本保存在一个只能由特权用户执行的私有目录中,并将其安排在该用户的cron中。执行脚本时应该没有问题

其次,您可以更改将缓存数据写入公共目录的位置。最好将其保存在一个非公共目录中,但如果您无法想出其他方法,并且数据可以公开,那么可能也可以


最后,使用$\u SERVER['SERVER\u ADDR']和$\u SERVER['REMOTE\u ADDR']可能不是检查服务器是否正在运行脚本的最佳方法。首先,我认为在运行命令行PHP脚本时,不会设置$_SERVER['REMOTE\u ADDR']。这是从HTTP头中获取的,因为没有,所以它将是空的。事实上,这就是为什么您会收到警告-这些警告没有设置。(编辑:查看PHP文档,可能不会为非浏览器脚本设置“SERVER\u ADDR”变量)

通过控制台而不是web服务器执行脚本

cron可以如下所示:

*/5 * * * * php -f /path/to/cron.php
if ( !isset($_SERVER['argc']) )
    die("Must be run from the command line!\n");
然后文件可以执行以下操作:

cron.php:
<?php

if ( array_key_exists('REMOTE_ADDR', $_SERVER) )
    die("Can only be run from the command line!");
现在,您的脚本应该能够从文件系统访问该文件夹,但无法通过web服务器访问该文件夹

如果您可以在服务器上设置cron作业(通过web管理员或其他方式,听起来您可以),则可以如上所述,即:使用
php-f/home/site/publichtml/cron.php
作为命令,并包括对数组键的检查

或者,您可以这样检查:

*/5 * * * * php -f /path/to/cron.php
if ( !isset($_SERVER['argc']) )
    die("Must be run from the command line!\n");
$\u服务器['argc']
仅在从命令行执行脚本时设置

如果您可以将cron脚本保留在web根目录之外,那么很好。如果没有,那应该是安全的

最后,要消除E_通知,请将以下内容添加到cron.php的顶部:

error_reporting(E_ALL ^ E_NOTICE); // Turn off notices


我想答案隐藏在你从乔恩那里得到的第一个答复中

因此,如果您只希望通过cron访问此脚本,请检查会话超全局是否存在:

if (is_array($_SESSION)) die();
而且,仅仅因为这很简单,就创建一个
.htaccess
文件并执行拒绝所有


我将$\u会话键入为$\u服务器,这是我的错。这符合你的需要

很遗憾,我无法访问控制台。这是一个共享的web主机。如果您可以设置cron作业(通过管理面板),您应该仍然可以使其正常工作,但您可能会失去一些安全性(例如:需要将缓存目录移动到web根目录中)。我尝试在ftp客户端中的文档根目录之前创建一个新文件夹,但收到一条权限被拒绝的消息。我应该与您的主机联系,也许shell访问是默认情况下他们无法启用的选项。我为我的大多数客户都这么做。如果您在plesk环境中,安全性被如此锁定,他们应该不会担心。我如何在共享Web主机上创建这样的目录?这不是真的。从命令行运行此脚本:“print_r($\u SERVER);”。