찾다
백엔드 개발PHP 튜토리얼深入讲解PHP线程并发种类_PHP教程
深入讲解PHP线程并发种类_PHP教程Jul 15, 2016 pm 01:28 PM
php모직물존재하다성취하다경쟁 상대어떻게우리를깊이 들어가다~의유형고려하다설명하다

线程是我们在做项目中首要考虑的,在php中怎么实现线程呢,我们这里就看看PHP线程的实现。许多 PHP 开发人员认为,由于标准的 PHP 缺少线程功能,因此实际 PHP 应用程序不可能执行多任务处理。

例如,如果应用程序需要其他 Web 站点的信息,那么在远程检索完成之前它都必须停止。这是错误的!通过本文了解如何使用 stream_select 和 stream_socket_client 实现进程内 PHP 多任务处理。PHP 不支持线程。尽管如此,与前述大多数 PHP 开发人员所相信的想法形成对比的是,PHP 应用程序可以 执行多任务处理。让我们开始尽可能清晰地描述一下 “多任务” 和 “线程” 对于 PHP 编程的意义。

PHP线程并发的种类

首先抛开几个和主题无关的例子。PHP 与多任务或并发的关系十分复杂。在较高层次上,PHP 经常涉及多任务:以多任务方式使用 标准的服务器端 PHP 安装 —— 例如,作为 Apache 模块。换句话说,若干个客户机 —— Web 浏览器 —— 可以同时请求同一个 PHP 解释的页面,而 Web 服务器将差不多同时返回所有这些页面。

一个 Web 页面不会妨碍其他 Web 页面的发送,尽管可能会由于诸如服务器内存或网络带宽之类的受限资源而使它们相互之间略有妨碍。这样,实现并发 的系统级需求可能适合使用基于 PHP 的解决方案。就实现而言,PHP 允许它的管理 Web 服务器负责实现并发。

Ajax 名下的客户端并发近几年来也已成为开发人员关注的焦点。虽然 Ajax 的含义已经变得十分模糊,但是它的一个方面是浏览器显示可以同时执行计算和保留对诸如选择菜单项之类的用户操作的响应。这实际上就是某种 多任务。用 PHP 编码的 Ajax 就是这样 —— 但是不涉及任何特定的 PHP;用于其他语言的 Ajax 框架均以完全相同的方法操作。

只粗略地涉及 PHP 的第三个并发实例是 PHP/TK。PHP/TK 是 PHP 的扩展,用于为核心 PHP 提供可移植图形用户界面(GUI)绑定。PHP/TK 允许用 PHP 编写代码构造桌面 GUI 应用程序。其基于事件的特性将模拟一种易于掌握并且比线程更少出错的并发形式。此外,并发是 “继承” 自一项辅助技术,而不是 PHP 的基本功能。

向 PHP 本身添加线程支持的试验已经做过多次。据我所知,没有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的实现表明事件可能比线程能更好地体现 PHP 的并发。PHP V5 证明事实确实如此。使用标准的 PHP V4 和更低版本,必须按顺序执行 PHP 应用程序的所有工作。例如,如果程序需要在两个商业站点检索商品的价格,则请求第一个站点的价格,等待至响应到达,再请求第二个站点的价格,然后再次等待。如果程序请求同时完成若干项任务会怎么样?总体来看,程序将在一段时间内完成,在这段时间内,将始终进行连续处理。

第一个示例PHP线程新的 stream_select 函数及它的几个助手使这成为可能。请考虑以下示例。

清单 1. 同时请求多个 HTTP 页面

<ol class="dp-xml">
<li class="alt"><span><span><?php  </span></span></li>
<li class=""><span>echo "Program starts at ". date('h:i:s') . ".n";  </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute">timeout</span><span>=</span><span class="attribute-value">10</span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">result</span><span>=</span><span class="attribute-value">array</span><span>();  </span>
</li>
<li class="">
<span>$</span><span class="attribute">sockets</span><span>=</span><span class="attribute-value">array</span><span>();  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">convenient_read_block</span><span>=</span><span class="attribute-value">8192</span><span>;  </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>/* Issue all requests simultaneously; there's no blocking. */  </span></li>
<li class="">
<span>$</span><span class="attribute">delay</span><span>=</span><span class="attribute-value">15</span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">id</span><span>=</span><span class="attribute-value">0</span><span>;  </span>
</li>
<li class=""><span>while ($delay > 0) {  </span></li>
<li class="alt">
<span>$</span><span class="attribute">s</span><span>=</span><span class="attribute-value">stream_socket_client</span><span>("phaseit.net:80", $errno,  </span>
</li>
<li class=""><span>$errstr, $timeout,  </span></li>
<li class="alt"><span>STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);  </span></li>
<li class=""><span>if ($s) {  </span></li>
<li class="alt"><span>$sockets[$id++]=$s;  </span></li>
<li class="">
<span>$</span><span class="attribute">http_message</span><span>=</span><span class="attribute-value">"GET /demonstration/delay?delay="</span><span> .  </span>
</li>
<li class="alt"><span>$delay . " HTTP/1.0rnHost: phaseit.netrnrn";  </span></li>
<li class=""><span>fwrite($s, $http_message);  </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>echo "Stream " . $id . " failed to open correctly.";  </span></li>
<li class="alt"><span>}  </span></li>
<li class="">
<span>$delay </span><span class="attribute">-</span><span>= </span><span class="attribute-value">3</span><span>;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>while (count($sockets)) {  </span></li>
<li class="">
<span>$</span><span class="attribute">read</span><span>=$sockets;  </span>
</li>
<li class="alt">
<span>stream_select($read, $</span><span class="attribute">w</span><span>=</span><span class="attribute-value">null</span><span>, $</span><span class="attribute">e</span><span>=</span><span class="attribute-value">null</span><span>, $timeout);  </span>
</li>
<li class=""><span>if (count($read)) {  </span></li>
<li class="alt"><span>/* stream_select generally shuffles $read, so we need to  </span></li>
<li class=""><span>compute from which socket(s) we're reading. */  </span></li>
<li class="alt"><span>foreach ($read as $r) {  </span></li>
<li class="">
<span>$</span><span class="attribute">id</span><span>=</span><span class="attribute-value">array_search</span><span>($r, $sockets);  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">data</span><span>=</span><span class="attribute-value">fread</span><span>($r, $convenient_read_block);  </span>
</li>
<li class=""><span>/* A socket is readable either because it has  </span></li>
<li class="alt"><span>data to read, OR because it's at EOF. */  </span></li>
<li class=""><span>if (strlen($data) == 0) {  </span></li>
<li class="alt"><span>echo "Stream " . $id . " closes at " . date('h:i:s') . ".n";  </span></li>
<li class=""><span>fclose($r);  </span></li>
<li class="alt"><span>unset($sockets[$id]);  </span></li>
<li class=""><span>} else {  </span></li>
<li class="alt">
<span>$result[$id] </span><span class="attribute">.</span><span>= $data;  </span>
</li>
<li class=""><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span>} else {  </span></li>
<li class="alt"><span>/* A time-out means that *all* streams have failed  </span></li>
<li class=""><span>to receive a response. */  </span></li>
<li class="alt"><span>echo "Time-out!n";  </span></li>
<li class=""><span>break;  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span>}  </span></li>
<li class="alt"><span>?>  </span></li>
</ol>

如果运行此清单,您将看到如下所示的输出。


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/446460.htmlTechArticle线程是我们在做项目中首要考虑的,在php中怎么实现线程呢,我们这里就看看PHP线程的实现。许多 PHP 开发人员认为,由于标准的 PHP 缺少线...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

php怎么将url的参数转化成数组php怎么将url的参数转化成数组Apr 21, 2022 pm 08:50 PM

转化方法:1、使用“mb_substr($url,stripos($url,"?")+1)”获取url的参数部分;2、使用“parse_str("参数部分",$arr)”将参数解析到变量中,并传入指定数组中,变量名转为键名,变量值转为键值。

php怎么去掉字符串首位的tab空白符php怎么去掉字符串首位的tab空白符Apr 22, 2022 pm 07:11 PM

在php中,可以利用ltrim()函数来去掉字符串首位的tab空白符,语法为“ltrim(string)”;当只给ltrim()函数传入一个参数,用于规定要检查的字符串时,可删除该字符串开始位置的空白字符(例空格、tab制表符、换行符等)。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기