PHP会话同步

jtn*_*ire 5 javascript php ajax synchronisation

我正在用PHP开发WebApp.用户可以单击一个按钮,PHP代码最终将调用系统执行程序.由于WebApp将使用AJAX,因此用户可能会单击该按钮两次,或者确实单击另一个将启动另一个exec进程的按钮.

现在,我知道我可以写一个小的javascript来禁用按钮,直到单个事件完成.但是,这是客户端强制执行,很容易被覆盖.

我可以在PHP方面做些什么来阻止这样的事情发生吗?在我的头上,我有一个会话变量起到"信号灯",并执行每个脚本之前,这个变量将被检查的一个想法,必须返回0之前,脚本可以继续.

我是否采取正确的方式?或者这只会为死锁/竞争条件打开一堆蠕虫?

谢谢

更新:为了将其置于上下文中,我正在开发的系统将用于启动,停止和重新映像虚拟专用服务器.如果按下了重新映像按钮,PHP脚本将调用一些bash脚本开始重新映像VPS.但是,如果用户在完成此操作时尝试启动VPS ....

Sho*_*hoe 1

您可以使用jQuery.ajax()该选项并将其设置async为 false:

async默认值: true 默认情况下,所有请求都是异步发送的(即默认设置为 true)。如果需要同步请求,请将此选项设置为 false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作

你可以这样使用它:

$.ajax({
    type: "POST",
    url: "file.php",
    async: false,
    data: data,
    success: function(return){
        alert("Success: "+return);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您想添加加载程序,只需将其应用为:

startLoader();
$.ajax({
    type: "POST",
    url: "file.php",
    async: false,
    data: data,
    success: function(return){
        alert("Success: "+return);
    }
});
endLoader();
Run Code Online (Sandbox Code Playgroud)

然而你的 PHP 想法根本就不是一个好想法。打开一个会话并执行此类事情的所有过程是毫无用处的,并且会减慢您的脚本速度。您应该问自己:我真的需要阻止它吗?

如果答案是肯定的,那么请执行以下操作:processes在数据库中创建一个名为的表。在该表内创建 2 个字段:其中一个是进程标识符:process_id;第二个是进程状态:process_status。第一个是您将使用 sha1(IMAGE) 定义的整数。第二个是一个整数:1代表“忙”,0代表“空闲”。

然后你可以做这样的事情:

SELECT process_status FROM vps_processes WHERE process_id = sha1(CURRENT_IMAGE);
Run Code Online (Sandbox Code Playgroud)

并检查它是什么10。如果是1则阻止脚本;如果是0那么你查询:

UPDATE vps_processes SET process_status = 1 WHERE process_id = sha1(CURRENT_IMAGE);
Run Code Online (Sandbox Code Playgroud)

然后运行您必须运行的内容并在脚本查询末尾:

UPDATE vps_processes SET process_status = 0 WHERE process_id = sha1(CURRENT_IMAGE);
Run Code Online (Sandbox Code Playgroud)