我有一个 PHP 文件x.php ,每次运行时都会输出b.xml 。我这样做的方法是使用 crontab 运行x.php文件。问题是由于服务器的设置,新文件的权限为 400。所以我还有另一个 crontab 行将文件b.xml权限更改为 777,以便下次可以运行x.php 。
我觉得我把这件事弄得太复杂了。有什么办法可以让这更简单一点吗?
您需要在 x.php 脚本中将文件 chmod 为 777。
创建 b.xml 后,运行以下行:
chmod('path/b.xml', 0777);
请注意,使用 chmod 时应始终指定八进制数。
运行 cron 作业时,应特别注意运行 cronjob 的用户。
通常在共享服务器上,您将拥有自己的登录名,因此 cron 作业以该用户身份运行。我问你的问题——那个用户和你的网络服务器一样吗?通常 php 作为“apache”运行,而 cron 可能作为“tanner”运行。在这种情况下,将 b.xml 设置为 tanner 拥有,并且权限为 400 意味着只有 tanner 可以更改文件。要解决这个问题,如果您无权访问 umask,一种方法是将您的 cron 作业更改为作为网络服务器运行:
su -c "php /home/jonathan/public_html/b.php" apache
这可能会也可能不会起作用,具体取决于您是否被允许以用户身份切换到 apache。不要忘记将 apache 切换到实际的 Web 服务器用户名。
现在,如果这不起作用,那么另一种选择是获得 777 权限。请记住,在共享服务器上,这意味着该服务器上的任何人如果知道路径,则可能会访问该文件。
OP建议的另一种方式:
0,10,20,30,40,50 * * * * /usr/bin/wget http://example.com/user/x.php
这种方式将始终以 apache 运行的 apache(或其他)用户身份运行,确保下次访问时,该文件将可用。
这应该有效:
// set permission
chmod('path/to/b.xml', 777);
// do other stuff
为了解决这个问题,我最终只创建了一个 cronjob,如下所示:
0,10,20,30,40,50 * * * * /usr/bin/wget http://example.com/user/x.php
这执行了创建 b.xml 的文件,并且由于执行脚本的用户是公开的,因此权限也保持公开。
要求服务器管理员创建一个新用户,该用户拥有脚本写入 xml 文件的文件夹。以这样的用户身份通过您的 cron 作业运行您的 php 脚本。如果您以文件夹所有者的身份运行脚本,则可以通过 php 脚本更改权限。