Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在实时站点上只执行一次php脚本_Php - Fatal编程技术网

在实时站点上只执行一次php脚本

在实时站点上只执行一次php脚本,php,Php,我有一个脚本,可以实时执行更新功能。我会将它移动到cron作业中,但由于一些限制,我更愿意在页面加载时激活并调用它 问题是,当有大量的流量时,它不太起作用,因为它使用一些随机和加权的数字,所以如果它被击中很多次,结果不是我们想要的 所以,问题是。有没有一种方法可以告诉特定脚本被访问了多少次?一次只能做一次 谢谢大家! 您正在寻找的技术称为锁定 最简单的方法是创建一个临时文件,并在操作完成后将其删除。其他进程将查找该临时文件,查看它是否已存在并将其删除 但是,您还需要注意锁的所有者进程崩溃以及无法

我有一个脚本,可以实时执行更新功能。我会将它移动到cron作业中,但由于一些限制,我更愿意在页面加载时激活并调用它

问题是,当有大量的流量时,它不太起作用,因为它使用一些随机和加权的数字,所以如果它被击中很多次,结果不是我们想要的

所以,问题是。有没有一种方法可以告诉特定脚本被访问了多少次?一次只能做一次


谢谢大家!

您正在寻找的技术称为锁定

最简单的方法是创建一个临时文件,并在操作完成后将其删除。其他进程将查找该临时文件,查看它是否已存在并将其删除

但是,您还需要注意锁的所有者进程崩溃以及无法移除锁的可能性。这就是这个简单任务变得复杂的地方

基于文件的锁定解决方案

PHP有一个内置的
flock()
函数,它承诺提供一个独立于操作系统的基于文件的锁定功能。有一些关于如何使用它的实用提示。但是,手册页面警告说,在某些情况下,
flock()
会遇到多个PHP脚本实例同时尝试获取锁的问题。似乎在这个问题上有更高级的答案,但它们都不是很容易实现的

基于数据库的锁定

这本书的作者——可能被
flock()
的复杂情况吓跑了——要求使用其他非基于文件的锁定技术,并提出了MySQL的
GET\u LOCK()
。我从未使用过它,但它看起来非常简单——如果你使用mySQL,它可能值得一试


该死,如果你想做对的话,这个问题很复杂!有兴趣看看是否有更优雅的东西出现。

您正在寻找的技术称为锁定

最简单的方法是创建一个临时文件,并在操作完成后将其删除。其他进程将查找该临时文件,查看它是否已存在并将其删除

但是,您还需要注意锁的所有者进程崩溃以及无法移除锁的可能性。这就是这个简单任务变得复杂的地方

基于文件的锁定解决方案

PHP有一个内置的
flock()
函数,它承诺提供一个独立于操作系统的基于文件的锁定功能。有一些关于如何使用它的实用提示。但是,手册页面警告说,在某些情况下,
flock()
会遇到多个PHP脚本实例同时尝试获取锁的问题。似乎在这个问题上有更高级的答案,但它们都不是很容易实现的

基于数据库的锁定

这本书的作者——可能被
flock()
的复杂情况吓跑了——要求使用其他非基于文件的锁定技术,并提出了MySQL的
GET\u LOCK()
。我从未使用过它,但它看起来非常简单——如果你使用mySQL,它可能值得一试


该死,如果你想做对的话,这个问题很复杂!有兴趣看看是否有更优雅的东西出现。

您可以这样做(需要PHP 5):

默认情况下覆盖文件(与追加相反),因此文件的内容只应被“锁定”或不被锁定。您需要指定LOCK_EX标志,以确保在尝试写入该文件时,该文件当前未被脚本的另一个实例打开


显然,正如@Pekka在他的回答中提到的,如果在放置锁和移除锁之间发生致命错误(或PHP崩溃,或服务器崩溃等),这可能会导致问题,因为文件将保持锁定状态

您可以这样做(需要PHP5):

默认情况下覆盖文件(与追加相反),因此文件的内容只应被“锁定”或不被锁定。您需要指定LOCK_EX标志,以确保在尝试写入该文件时,该文件当前未被脚本的另一个实例打开


显然,正如@Pekka在他的回答中提到的,如果在放置锁和移除锁之间发生致命错误(或PHP崩溃,或服务器崩溃等),这可能会导致问题,因为文件将保持锁定状态

使用sql查询启动脚本,该查询测试数据库中的时间戳字段是否在1天前。 如果是-写入当前时间戳并执行脚本

pseudo-sql来展示这个想法:

UPDATE runs SET lastrun=NOW() WHERE lastrun<NOW()-1DAY

updateruns SET lastrun=NOW(),其中lastrun使用sql查询启动脚本,该查询测试数据库中的时间戳字段是否在1天前。
如果是-写入当前时间戳并执行脚本

pseudo-sql来展示这个想法:

UPDATE runs SET lastrun=NOW() WHERE lastrun<NOW()-1DAY

updateruns SET lastrun=NOW()其中lastrunBrad,谢谢。如果我们想要多个产品的锁呢?您会为每个产品创建一个文件吗?比如product_id-lock.txt,或者您可能会将其移动到包含每个产品记录的db表“product_locks”中吗?我甚至会更进一步,只创建/删除一个空锁文件。这消除了种族歧视的可能性,谢谢。如果我们想要多个产品的锁呢?您会为每个产品创建一个文件吗?比如product_id-lock.txt,或者您可能会将其移动到包含每个产品记录的db表“product_locks”中吗?我甚至会更进一步,只创建/删除一个空锁文件。这消除了竞争条件的可能性您可以使用register\u shutdown\u function()注册函数来清除锁。即使脚本因致命错误而崩溃,它也会被调用。您可以使用register\u shutdown\u function()注册函数以清除