加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 如何防止脚本的多个实例?

发布时间:2021-07-06 05:20:36 所属栏目:大数据 来源: https://www.jb51.cc
导读:我有PHP脚本,我必须在Linux和Windows服务器上运行. 我想使用相同的脚本而不对这两个环境进行任何修改. 对于我的Windows环境,这些脚本将使用cron(在linux上)和Windows调度程序(或其他,我现在不关心)进行调度. 但是,某些脚本可能需要几分钟才能完成.我只想防止

我有PHP脚本,我必须在Linux和Windows服务器上运行.
我想使用相同的脚本而不对这两个环境进行任何修改.

对于我的Windows环境,这些脚本将使用cron(在linux上)和Windows调度程序(或其他,我现在不关心)进行调度.

但是,某些脚本可能需要几分钟才能完成.我只想防止调度程序(cron或windows的一个)在上次启动它之前启动相同的脚本.

我不知道该怎么做..
我想确保在执行期间出现问题时释放“锁定”,因此下次无需人工干预时再次启动.

也许有一个虚拟文件上的羊群可以做到这一点,但我不知道该怎么做.

我在这些服务器上也有一个MySQL数据库.我想可能在数据库端使用锁.

1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;

如果脚本名称在表中,那么我可以阻止它运行.
如果脚本执行失败,则MysqL将自动回滚事务,以便下次调用脚本时不显示该行.

但是,在一个事务中,有没有办法让其他连接看到未提交的数据?如果有,怎么样?

如果无法使用回滚的话,我还想过在行上使用锁.

1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).

但我的主要问题是MysqL.选择FOR UPDATE挂起,直到释放上一个锁或者超过50秒超时(innodb_lock_wait_timeout变量)为止.我希望MysqL当场告诉我我的行被锁定而不影响整个数据库.这是因为innodb_lock_wait_timeout变量是全局变量(不是会话变量).
是否有另一个变量模仿Oracle中可用的NO_WAIT子句?

或者我应该让脚本挂起50秒没有任何问题?

什么是最好的方法,因为我是一个PHP新手,我不想在服务器上造成任何问题.

也许我有另一个选项,我没有看到..

解决方法:

我使用…套接字解决了这个问题.你可以启用PHP_sockets扩展然后尝试它.这是代码示例:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (false === $socket) {
    throw new Exception("can't create socket: ".socket_last_error($socket));
}
## set $port to something like 10000
## hide warning, because error will be checked manually
if (false === @socket_bind($socket, '127.0.0.1', $port)) {
    ## some instanse of the script is running
    return false;
} else {
    ## let's do your job
    return $socket;
}

特定$port上的绑定套接字是concurent执行的安全操作.操作系统将确保没有其他进程将套接字绑定到同一端口.您只需要检查返回值.

如果脚本崩溃,则操作系统将自动解除绑定端口.

这也可以用于任何语言.我已经在perl和基于PHP的项目上测试了它.即使我们错误地在crontab中添加了两次脚本,它也会停止并行执行.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读