您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
解决php线程Thread无法启动start时报错PHP Fatal error: Uncaught RuntimeException: cannot start
发布时间:2021-10-17 16:27:17编辑:雪饮阅读()
今天用php模拟器多个用户请求以测试并发问题,结果报错:
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php-7.0.14-Win32-VC14-x86\php.exe D:\phpstudy_pro\WWW\demo2.php
PHP Fatal error: Uncaught RuntimeException: cannot start NoLock, out of resources in D:\phpstudy_pro\WWW\demo2.php:56
Stack trace:
#0 D:\phpstudy_pro\WWW\demo2.php(56): Thread->start()
#1 {main}
thrown in D:\phpstudy_pro\WWW\demo2.php on line 56
Fatal error: Uncaught RuntimeException: cannot start NoLock, out of resources in D:\phpstudy_pro\WWW\demo2.php:56
Stack trace:
#0 D:\phpstudy_pro\WWW\demo2.php(56): Thread->start()
#1 {main}
thrown in D:\phpstudy_pro\WWW\demo2.php on line 56
\r\n本次线程:tid=15208 当前参团人数=0,参团成功
\r\n本次线程:tid=5768 当前参团人数=1,参团成功
\r\n本次线程:tid=3988 当前参团人数=2,参团成功
\r\n本次线程:tid=16576 当前参团人数=3,参团成功
\r\n本次线程:tid=14204 当前参团人数=4,参团成功
\r\n本次线程:tid=17312 当前参团人数=5,参团成功
\r\n本次线程:tid=5700 当前参团人数=6,参团成功
\r\n本次线程:tid=604 当前参团人数=7,参团成功
\r\n本次线程:tid=13292 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13612 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=14984 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=17204 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13436 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3904 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=14200 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8172 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3700 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10228 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13912 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12424 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=9716 当前参团人数=8,超过参团总人数
那么源代码是:
demo2.php:
<?php
//解决cmd命令中中文乱码
exec('chcp 65001');
error_reporting(E_ALL ^ E_DEPRECATED);
class Conf {
public static $host = 'localhost';
public static $port = '3306';
public static $user = 'root';
public static $passwd = '123456';
public static $dbname = 'test';
}
class NoLock extends Thread {
public function run() {
$file = fopen(__DIR__.'/lock.txt','w+');
//加锁
if(flock($file,LOCK_EX)){
//模拟真实环境,连接数据库,每次都返回一个新的数据库连接
$mysql = mysqli_connect(Conf::$host.':'.Conf::$port,Conf::$user,Conf::$passwd,Conf::$dbname);
//从数据库中取出库存
$sql = "select count(*) as num from goods_transaction";
$result = mysqli_query($mysql,$sql);
$row=mysqli_fetch_assoc($result);
$tid=self::getCurrentThreadId();
$str='\r\n本次线程:tid='.$tid.' 当前参团人数='.$row["num"];
if($row["num"]>=8){
$str.=",超过参团总人数\r\n";
echo $str;
}
else{
$insert_res=mysqli_query($mysql,"insert into goods_transaction values(".$tid.")");
if($insert_res){
$str.=",参团成功\r\n";
echo $str;
}
}
mysqli_close($mysql);
flock($file,LOCK_UN);//解锁
}
//关闭文件
fclose($file);
}
}
$mysql = mysqli_connect(Conf::$host.':'.Conf::$port,Conf::$user,Conf::$passwd,Conf::$dbname);
//清空之前的交易记录
mysqli_query($mysql,"delete from goods_transaction");
mysqli_close($mysql);
//用100个模拟用户去参团
$clientArr = [];
for ($i=0;$i<100;++$i) {
$clientArr[$i] = new NoLock();
$clientArr[$i]->start();
}
//最终结果(结果不准,因为线程是异步的,直接去数据库看看)
$mysql = mysqli_connect(Conf::$host.':'.Conf::$port,Conf::$user,Conf::$passwd,Conf::$dbname);
$sql = "select count(*) as num from goods_transaction";
$result = mysqli_query($mysql,$sql);
$row=mysqli_fetch_assoc($result);
$str="\r\n全部线程跑完后的参团人数:".$row["num"]."\r\n";
echo $str;
?>
从运行结果来看大致意思是资源不足以运行的意思。
那么好吧,我调整线程数量5-10就可以运行了,调整到50也不能运行了。
在几个星期前我用php5.4都可以,而这里是php7.0.14竟然。。。
好吧,那我调整内存上限从默认的128m到512m竟然还是不行,那么好吧我怀疑难道是我运行的这个php7.0是x86导致的,于是我下载了php7.0系列的最高版本7.0.9的x64以及Thread扩展最新版的x 64版本。
那么分别是:php-7.0.9-Win32-VC14-x64、php_pthreads-3.1.6-7.0-ts-vc14-x64
然后安装了这个php-7.0.9-Win32-VC14-x64及php_pthreads-3.1.6-7.0-ts-vc14-x64扩展。
然后以php-7.0.9-Win32-VC14-x64来运行这个demo2.php的程序就好多了:
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php-7.0.9-Win32-VC14-x64\php.exe D:\phpstudy_pro\WWW\demo2.php
\r\n本次线程:tid=12492 当前参团人数=0,参团成功
\r\n本次线程:tid=1244 当前参团人数=1,参团成功
\r\n本次线程:tid=3212 当前参团人数=2,参团成功
\r\n本次线程:tid=11620 当前参团人数=3,参团成功
\r\n本次线程:tid=16740 当前参团人数=4,参团成功
\r\n本次线程:tid=9208 当前参团人数=5,参团成功
\r\n本次线程:tid=1868 当前参团人数=6,参团成功
全部线程跑完后的参团人数:7
\r\n本次线程:tid=17312 当前参团人数=7,参团成功
\r\n本次线程:tid=2564 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12912 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3248 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7528 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=5060 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=17404 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3484 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11404 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1408 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15300 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16180 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8492 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=2376 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12992 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12872 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15816 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15460 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1652 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4264 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4208 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1604 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7076 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7692 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4508 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4172 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13304 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3964 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11476 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=14600 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11972 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1708 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10212 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11376 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3364 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16616 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13972 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8808 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11596 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11868 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=5688 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10308 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7496 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15688 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11488 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1700 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12124 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3012 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12516 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16884 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7360 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11040 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10844 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1796 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1460 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=2856 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12572 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15740 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=7328 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4236 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10860 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11828 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=828 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=17340 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16872 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=5628 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8116 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3820 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=14204 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12896 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=10772 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13048 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12340 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=15164 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11752 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=4660 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12044 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=11180 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1500 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=3188 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=14072 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=2220 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16760 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=13516 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=5312 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8300 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12576 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=6260 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=2052 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=16584 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=1780 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=8144 当前参团人数=8,超过参团总人数
\r\n本次线程:tid=12824 当前参团人数=8,超过参团总人数
关键字词:Thread,php,Uncaught RuntimeException: cannot start
相关文章
- thinkphp6 db层面(非model形式)对于查询的字段排除(隐藏
- thinkphp6单入口多应用下的中间件(及别名)的使用
- thinkphp6中jwt的使用
- thinkphp6的单入口多应用模式
- phpunit-phpunit.xml-phpunit-beStrictAboutTodoAnnot
- phpunit-phpunit.xml-beStrictAboutTestsThatDoNotTes
- phpunit-phpunit.xml-phpunit-beStrictAboutOutputDur
- phpunit-phpunit.xml-phpunit-stopOnDefect
- phpunit-phpunit.xml-stopOnSkipped
- phpunit-phpunit.xml-phpunit-stopOnRisky