在实时站点上只执行一次php脚本
我有一个脚本,可以实时执行更新功能。我会将它移动到cron作业中,但由于一些限制,我更愿意在页面加载时激活并调用它 问题是,当有大量的流量时,它不太起作用,因为它使用一些随机和加权的数字,所以如果它被击中很多次,结果不是我们想要的 所以,问题是。有没有一种方法可以告诉特定脚本被访问了多少次?一次只能做一次在实时站点上只执行一次php脚本,php,Php,我有一个脚本,可以实时执行更新功能。我会将它移动到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()注册函数以清除