php如何支持多线程并发


java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法。

今天说说如果你无法操控apache的服务器,如何模拟php并发

<?php
if(function_exists('date_default_timezone_set')) {
    date_default_timezone_set('PRC');
}
 
function a()
{
	$time = time();
 
	sleep(3);
	$fp = fopen('result_a'.$time.'.log', 'w');
	fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
	fclose($fp);
}
function b()
{
	$time = time();
 
	sleep(3);
	$fp = fopen('result_b'.$time.'.log', 'w');
	fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
	fclose($fp);
}
 
if(!isset($_GET['act'])) $_GET['act'] = 'a';
 
if($_GET['act'] == 'a')
{
	a();
}
else if($_GET['act'] == 'b') b();
?>

以上代码,在本地写入一个文件。
如果你访问 localhost/a.php 在两个浏览器标签尽可能快的同时打开,发现两个文件创建时间相差为3秒

但是如果你访问localhost/a.php?act=b 另一个访问/a.php?act=a 你发现两个文件创建的时间几乎差不多。

对于apache来说同样的url意味着一个线程(我们或者说是进程),但是不同的URL意味着可以并发

如果php内部有下载的动作

function runThread()
{
	down("http://localhost/test/a.php?act=a");
}
if($_GET['act'] == 'run')
{
	echo 'start:';
 
	runThread();
 
	echo ' End';
}

http://localhost/test/a.php?act=run

http://localhost/test/a.php?act=run&s=2

只要主访问的url不同,则认为是不同的进行,意味着并发。文件创建时间不为3秒

本地有Linux服务器的朋友也可以借助linux来进行模拟并发

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然后写一段SHELL代码

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

如果你是一名技术人员可加我QQ 2651-0442-02,如果你是java技术人还可以加入QQ群 1784-9136-0
你将得到的不仅仅是技术的交流,还有职业机会,人生解惑.
首发地址:月小升博客https://java-er.com/blog/php-how-many-threads/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
此条目发表在 Linux, PHP 分类目录,贴了 , 标签。将固定链接加入收藏夹。
既然来了,就评论一下,不会怀孕的

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">