在Cronjob(Crontab)中使用会话

3

你好,能否在定时任务中使用会话(sessions)?

我使用的脚本是:

session_start();

if(empty($_SESSION['startwert'])){$startwert = 0;}
else {$startwert = $_SESSION['startwert'];}

if(empty($_SESSION['zielwert'])){$zielwert = 10000;}
else {$zielwert = $_SESSION['zielwert'];}


....


$_SESSION['startwert'] = $zielwert;
$_SESSION['zielwert'] = $zielwert + 10000;
echo "Startwert: ".$_SESSION['startwert']."<br>";
echo "Zielwert: ".$_SESSION['zielwert']."<br>";

但是 Cron 总是将“startwert”设置为10000,“zielwert”设置为20000,不会增加这些值。


现在我尝试了这个。

/usr/bin/wget -O - http://mydomain.com/script.php

但是cron总是从10000和20000开始。有什么想法吗?

1
会话依赖于cookies,因此要使它们适用于cron作业,您需要调用的任务能够在调用之间保留cookies。这要求您使用HTTP用户代理,例如curlwget从cron调用PHP文件,而不是php -f ...或类似方法。编辑问题以包括当前运行作业的crontab中的行,我将能够用基于wget的等效方法回答,该方法可以保留cookies,因此应该与会话一起工作。 - Aaron Miller
好的,所以我只需要像这样设置我的cron吗?wget -q --spider mydomain.com/script.php - TrivoXx
为什么不将“会话”数据缓存到本地文件中,以便每次执行时进行读取/更新呢? - Mike Brant
@MikeBrant 一个非常好的问题;我假设问题中的代码只是一个示例,与实际的cron作业无关,并且cron作业正在运行一些PHP代码,这些代码太大和/或太复杂,无法从使用会话转换为使用直接磁盘存储,或者有其他同样好的理由不这样做。 - Aaron Miller
2个回答

5
如果您通过wget从cron调用PHP脚本,请使用--save-cookies选项;如果通过curl调用,使用--cookie-jar选项。(如果您通过php -f [...]或类似方式调用PHP脚本,则需要先通过wgetcurl来调用它。)
例如:
wget --load-cookies /tmp/cron-session-cookies --save-cookies /tmp/cron-session-cookies --keep-session-cookies [...]

或者
curl -b --cookie-jar /tmp/cron-session-cookies [...]

默认情况下,wget 不会保存会话 cookies,但你希望它这样做,因此需要使用 --keep-session-cookies 选项;而curl 默认保存它们,所以只需使用 -b 启用 cookies 和 --cookie-jar 告诉 curl 它们的位置即可。无论哪种情况,都应将 [...] 替换为你已经传递给程序的任何选项和参数,并根据自己的喜好调整 cookie jar 文件的位置。

1
使用会话的方法是一个好答案。您还应该注意,会话过期时间需要设置为大于预定脚本执行时间之间的值。 - Mike Brant

2

并不完全正确。PHP会话依赖于cookie(忽略trans-sid模式),而cookie仅在HTTP上下文中存在。cron作业在CLI模式下运行,因此没有HTTP层来处理。

您可以通过在调用session_start();之前设置会话ID来强制CLI脚本使用特定的会话文件,但不能保证在cron作业启动时该特定ID实际存在,因为其他PHP实例的会话垃圾回收器可能已将其删除。


你对于会话过期的观点是正确的,但并不适用于所有的 cookies;wget 支持,并且我记得 curl 也支持通过传递一个指向 cookie jar 文件的参数来保留跨调用的 cookies。假设所讨论的 PHP 脚本不一定非要在 CLI 模式下运行,从问题中发布的内容来看似乎并非如此,那么就没有理由不能使用 cookies 并使其具有会话感知能力。 - Aaron Miller
好的,那么我只需要像这样设置我的cron吗? wget -q --spider http://mydomain.com/script.php - TrivoXx
是的,但OP并没有提到使用wget。我猜测cron作业直接调用PHP脚本,没有HTTP层。 - Marc B
根据提问者的评论,可以安全地假设他正在使用wget; 无论如何,如果他以CLI模式调用PHP脚本,如果他想要会话起作用,他就需要不这样做。 - Aaron Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接