浏览器请求同一php文件时,后一请求会被前一请求阻塞,有什么办法不阻塞吗
浏览器请求同一php文件时,后一请求会被前一请求阻塞,有什么办法不阻塞吗
例如同时请求
a.php
sleep(10);
echo 'hello';
exit;
后面的请求会在10s后才开始执行。
如果同时请求a.php 和 b.php,则会同时执行。
b.php == a.php
回复内容:
浏览器请求同一php文件时,后一请求会被前一请求阻塞,有什么办法不阻塞吗
例如同时请求
a.php
sleep(10);
echo 'hello';
exit;
后面的请求会在10s后才开始执行。
如果同时请求a.php 和 b.php,则会同时执行。
b.php == a.php
这个问题有两种情况:
第一:如果开启了SESSION,并且SESSION使用了文件保存,在上一个脚本处理完之前,SESSION文件被锁住了,导致下一个脚本在获得锁之前处于等待的状态。
第二:如果使用同一个浏览器的多个标签页同时访问同一个URL,那么浏览器认为这些不同的请求是同一个人,会对你的每个请求进行排队,不做并发处理。不管Nginx还是Apache,都是在并发处理,只不过你的浏览器自作主张,把你的请求阻塞了,看起来好像是服务器不支持并发,实则不然。使用 IE6 ~ IE8 这些比较低级的浏览器就不会有这种现象。
题主的脚本明显没有用到SESSION,所以可以排除第一种情况。对于第二种情况,这是浏览器的设计问题,暂时也还没找到解决办法,如果有谁知道请告诉我一下,thanks
楼主说错了吧,第一个请求就会阻塞10s,但不影响第二个,每个请求一个进程。
这又不是nodejs
要知道浏览器是如何向PHP提交请求的,一般不是PHP首先处理请求,而是apache。之后apache会建立进程向PHP中转请求,所以不会出现阻塞,除非你用的不是个正常的HTTP服务。
PHP从5.4开始内置了一个用于开发测试的CLI HTTP Server:
php -S 127.0.0.1:8080 -t /www
CLI HTTP Server是一个单进程应用,同一时刻只能处理一个请求,后面的请求要进行排队.
如果你只开启了一个PHP-FPM/Apache Prefork MPM工作进程,情况也是如此.
sleep(10)这个长达10秒的操作由正在提供Web服务的PHP进程来处理显然是不合适的,因为这肯定会造成一个PHP工作进程被阻塞.这时可以考虑用popen或proc_open异步调用一个CLI程序比如一个CLI下的PHP脚本进行一些耗时的操作.
比如:
/www/index.php
<code><?php $sec = 10; pclose(popen('/www/cli.php '.$sec.' &', 'r')); </code></code>
/www/cli.php
<code>#!/png/php/5.4.39NTS/bin/php <?php //print_r($argv); sleep($argv[1]); file_put_contents('/www/cli.txt', $argv[1]); </code></code>
index.php并不会被10秒的操作阻塞,10秒的操作交给cli.php执行了,从而实现了异步.
我猜测你的问题是由于session写锁导致的,试试在sleep前加上session_write_close(); 看是否依然出现阻塞,可参见这篇文章:http://blog.csdn.net/haozi3156666/article/details/39502381, 是国外的某人写的

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다
