1

我想通过 cron-job 执行一个 PHP 脚本,但它必须每秒钟或每 2 秒执行一次。(PHP 文件通过 opengraph 更新页面的封面照片)

所以我决定写一个下面的shell脚本。但是 php 在由 shell 脚本执行时是如何工作的,它是像从浏览器请求的那样正常工作还是会发生什么?会话有效吗?

#!/bin/bash

while true; do
    /path/to/file.php
    sleep 1
done;

echo "Stopped" | mail -s "Cron script has stopped." mymail@domain.com
4

3 回答 3

5

不同之处在于您将没有$_GET,$_POST和其他可用的 http 特定的东西。会话也不起作用(为什么需要它们?)。您显然无法设置 cookie、标题和其他类似的东西。

除此之外,您几乎可以忽略您“在外壳中”的事实。

有关详细信息,请参见此处:http ://www.php.net/manual/en/features.commandline.differences.php

于 2013-03-13T09:52:23.463 回答
2

将所有浏览器方面从 PHP 中移除,这就是它的行为方式。您没有会话(除非您使用 cURL 调用它并存储 cookie somwehre)。

你得到 no$_GET$_POST- 相反你需要使用$args- 但如果你没有传递任何变量,这与你并不真正相关。

您显然需要确保您已授予脚本执行权限,否则,请使用/path/to/php /path/to/file.php.

看看这些资源,它们应该可以帮助你。

http://www.php.net/manual/en/features.commandline.differences.php http://www.php.net/manual/en/features.commandline.php

于 2013-03-13T09:58:11.953 回答
2

当您从命令行 (CLI) 执行 php 时,您会进入另一个环境。
存在多种差异

他们之中有一些是

Configuration

从命令行执行时,您运行另一个php.ini文件。(通常/etc/php5/php.ini

Permissions

在 Web 上,您通常使用 user.php 执行 PHP www-data
从命令行执行时,脚本将以当前用户身份执行。

Arguments

您不再有权访问$_GET, $_POST, $_FILES... 超全局变量。
相反,你有新的超全局变量,$argv并且$argc

Sessions

您无权访问session$_COOKIES

Relative Paths

脚本使用的路径是相对于命令开始的路径因此,在脚本中使用相对路径时要
小心./

例如:

$ pwd 
/path/to/project/

$ cat app/script.php
<?php
echo getcwd(), PHP_EOL;

$ php app/script.php
/path/to/project

$ cd app
$ php script.php
/path/to/project/app

您可以通过使用获取当前目录getcwd

于 2013-03-13T10:13:10.593 回答