MySQL - cron job调用的所有脚本都可以读取用户定义的变量吗?

时间:2016-06-07 18:33:02

标签: php mysql cron

我根据this SO answer按照以下方式定义变量:

$sql = "SET @update_id := '', @update_name := '';
            UPDATE table SET status=?, id=(SELECT @update_id:=id), name=(SELECT @update_name:=name)
            WHERE status=? AND id>? ORDER BY id ASC LIMIT 1;";

$stmt = $db->prepare($sql);
$stmt->execute(array(1, 0, $curRow));

然后在连续查询中访问它们:

$stmt = $db->prepare('SELECT @update_id, @update_blogid');
$stmt->execute();

这用于在更新行时标记行。该表很大,因此有几个同时运行的脚本,以帮助加快它。

如果脚本相同,但是在由cron作业启动的两个不同进程上,他们是否可以访问彼此的用户定义变量?

例如,在第一个进程能够读取值之前,第二个进程是否可以更新第一个进程设置的值?

According to the docs

  

用户定义的变量是特定于会话的。定义了用户变量   一个客户无法被其他客户看到或使用。

所以问题的根源可能是:两个独立的进程是由同一个cron作业发起的,被认为是不同的客户端吗?

否则,我最好的想法是在脚本打开时初始化一个随机数,并将其添加到每个变量名的末尾:

$rand = rand(100, 999);

$sql = "SET @update_id". $rand ." := '', @update_name". $rand ." := ''; ...";

但如果我能帮助它,我宁愿不这样做。即使凌乱的解决方案解决了它,对此的答案将是很好的知识,在后面的口袋里。

1 个答案:

答案 0 :(得分:1)

  

问题的根源是:两个独立的进程是由同一个cron作业发起的,被认为是单独的客户端吗?

是。它与运行由同一浏览器启动的两个单独脚本没有什么不同。除非您明确地在两个脚本之间共享信息,否则它们将作为单独的会话执行。