如何在浏览器中同时运行两个PHP脚本并写入同一文件以触发崩溃
嘿,我来帮你搞定这个问题!你想要在浏览器里精确同时跑两个PHP脚本,触发文件写入的冲突甚至崩溃,对吧?咱们一步步来:
实现精确同时运行两个脚本
浏览器手动开标签页点肯定做不到真正同步,这里有两个靠谱的办法:
用JS写个简单的测试页
写个HTML文件,用异步请求同时触发两个PHP脚本,浏览器会几乎同时发送这两个请求:<script> // 同时发起两个请求,Promise.all会并行执行它们 Promise.all([ fetch('firstFile.php'), fetch('secondFile.php') ]).then(results => { // 把两个脚本的运行时间打印到控制台 results.forEach((res, index) => { res.text().then(time => console.log(`脚本${index+1}运行时间: ${time}`)); }); }); </script>打开这个HTML页面,就能让两个PHP脚本近乎同时启动。
用命令行批量触发
如果你能用到终端,直接用curl并行执行:curl http://你的域名/firstFile.php & curl http://你的域名/secondFile.php &加
&会让两个命令在后台并行跑,也能实现同步触发。
调整代码触发崩溃/冲突
你现在的代码里用了flock($fh, LOCK_EX),这是排他锁——一个脚本拿到锁后,另一个会乖乖等着锁释放才继续,所以默认情况下不会崩溃,只是第二个脚本会慢一点。要触发问题,得改改代码:
去掉文件锁
把flock($fh, LOCK_EX);这行删掉,这样两个脚本会同时打开同一个文件写入,轻则数据被覆盖,重则因为文件句柄竞争直接报错。延长睡眠+去掉锁
给其中一个脚本加个sleep时间,同时去掉锁:// firstFile.php修改这一行 $rw->write('fileeeeeeee', 'FDSABNIFGA', 5); // 写入后hold住文件句柄5秒 // secondFile.php保持sleep(0)不变第一个脚本打开文件后会睡5秒,期间文件句柄没关闭,第二个脚本同时去写同一个文件,很大概率会触发文件资源冲突,导致脚本崩溃或者写入失败。
小提示
要是你的PHP跑在Apache/Nginx的FastCGI模式下,确保服务器会把两个请求分配到不同的PHP进程,这样才能真正触发并发竞争哦。
内容的提问来源于stack exchange,提问作者OmegaSkiller
相关产品推荐
相关产品推荐

