问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请写一段PHP代码,确保多个进程同时写入同一个文件成功

发布网友 发布时间:2022-04-06 03:57

我来回答

4个回答

懂视网 时间:2022-04-06 08:19

php实现多进程的方法:通过pcntl与posix扩展来实现。根据需求我们可以使用pcntl_fork()函数创建子进程,使用pcntl_wait()函数来阻塞当前进程。

php多进程需要pcntl,posix扩展支持。

多进程实现只能在cli模式下,在web服务器环境下,会出现无法预期的结果。

(推荐视频教程:php视频教程)

多进程核心函数:

pcntl_fork(创建子进程)、pcntl_wait(阻塞当前进程)

详细介绍:

pcntl_fork:

一次调用两次返回,在父进程中返回子进程pid,在子进程中返回0,出错返回-1。

pcntl_wait ( int &$status [, int $options ] ):

阻塞当前进程,直到任意一个子进程退出或收到一个结束当前进程的信号,注意是结束当前进程的信号,子进程结束发送的SIGCHLD不算。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用

阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;

非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。

pcntl_waitpid ( int $pid , int &$status [, int $options ] )

功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait 一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息。

(相关教程推荐:php图文教程)

举例:

php中一个始终保持固定个数的子进程在跑。

根据需求使用pcntl_fork(创建子进程)、pcntl_wait(阻塞当前进程)等核心函数

代码实现:

<?php

//最大的子进程数量
$maxChildPro = 8;

//当前的子进程数量
$curChildPro = 0;

//当子进程退出时,会触发该函数,当前子进程数-1
function sig_handler($sig)
{
 global $curChildPro;
 switch ($sig) {
 case SIGCHLD:
  echo 'SIGCHLD', PHP_EOL;
  $curChildPro--;
  break;
 }
}

//配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
declare(ticks = 1);

//注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
pcntl_signal(SIGCHLD, "sig_handler");

while (true) {
 $curChildPro++;
 $pid = pcntl_fork();
 if ($pid) {
//父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续
 if ($curChildPro >= $maxChildPro) {
  pcntl_wait($status);
 }
 } else {
//子进程运行代码
 $s = rand(2, 6);
 sleep($s);
 echo "child sleep $s second quit", PHP_EOL;
 exit;
 }
}

热心网友 时间:2022-04-06 05:27

首先PHP是支持进程的而不支持多线程(这个先搞清楚了),如果是对于文件操作,其实你只需要给文件加锁就能解决,不需要其它操作,PHP的flock已经帮你搞定了。
用flock在写文件前先锁上,等写完后解锁,这样就实现了多线程同时读写一个文件避免冲突。大概就是下面这个流程
/*
*flock(file,lock,block)
*file 必需,规定要锁定或释放的已打开的文件
*lock 必需。规定要使用哪种锁定类型。
*block 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。
*lock
*LOCK_SH 要取得共享锁定(读取的程序)
*LOCK_EX 要取得独占锁定(写入的程序)
*LOCK_UN 要释放锁定(无论共享或独占)
*LOCK_NB 如果不希望 flock() 在锁定时堵塞
/*
if (flock($file,LOCK_EX))
{
fwrite($file,'write more words');
flock($file,LOCK_UN);
}
else
{
//处理错误逻辑
}
fclose($file);
)

热心网友 时间:2022-04-06 06:45

$file = fopen("test.txt","w+");

// 排它性的锁定 先锁上,写完,打开。
if (flock($file,LOCK_EX))
  {
  fwrite($file,"Write something");
  // release lock
  flock($file,LOCK_UN);
  }
else
  {
  echo "Error locking file!";
  }

fclose($file);

热心网友 时间:2022-04-06 08:19

多进程写文件
function write_file($filename, $content)
{
$lock = $filename . '.lck';
$write_length = 0;
while(true) {
if( file_exists($lock) ) {
usleep(100);
} else {
touch($lock);
$write_length = file_put_contents($filename, $content, FILE_APPEND);
break;
}
}
if( file_exists($lock) ) {
unlink($lock);
}
return $write_length;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
遇到碰瓷怎么办 导致碰瓷者伤亡用负法律责 最新电子防盗装置 3个LED的小夜灯电路 买不到小功率3伏变压器,如何降压做个3伏70毫安电源 小夜灯按钮坏了怎么拆 哪里有各种定做手提袋 如图,我这个配置玩逆战为何会卡?pvp200左右,pve75左右,ping二三十,网... 女孩问你是的时候怎么回答 自习课 同学都睡着了 男同桌问我让我跟他比赛 比谁撒尿尿得远 问他... 想把一个女同学上了,又不想负责任,毕竟她对我没意思,我对她也没意思... 有一个晚上,女同学叫我一起玩,玩着玩着到了半夜,回自己的宿舍太远就... php如何判断一个字符串是否包含另一个字符串的某些字符 php 如何判断字符是汉字还是英文 php中 判断某字符串变量是否含有特定字符串 php 如何判断字符串中是否包含某些指定的字符串! php如何判断字符串是否是字母和数字的组合 php如何判断字符串里有没有特定字符串? 怎么用php来判断字符串的语言? php 怎么判断一个值为字符串 php如何处理用户在地址栏上手动填写错误信息 php自定义错误 和 错误日志可以一起用吗》 PHP自定义错误处理器不能报Parse error 如何处理php服务的500错误 PHP中出现错误位置怎么处理? 什么是错我的自定义PHP函数 PHP 自定义的错误处理程序 date函数出错 php 变量未定义等错误的解决方法 请问php怎么自定义404错误页面? PHP自定义错误处理函数 php删除数组中相同的元素 php把索引数组的第一个元素移除后索引不重置 php如何来多线程运行多个脚步 nginx 多进程模式 php如何多线程 php中pcntl_fork是什么意思,pcntl_fork创建子进程如何进行的? php如何进行多进程与异步调用方法 php的进程是什么样的,单进程多进程,线程呢? php怎么实现一个输入框一行一个数据,循环送到后面程序执行! php计划任务之验证是否有多个进程调用同一个job的方法 linux php pdo mysql 需要安装mysql吗 PHP如何清理网站缓存 php清除缓存的代码,应该怎么写? 指导一下,谢谢! 有代码展示的更好,多谢了 关于PHP销毁缓存里的变量并且重新载入页面的操作 php关闭页面而不关闭浏览器怎样清除cookie php 怎么清理 apache缓存 php问题求助,Notice: Undefined offset: 1 ,我的数组下标没有越界啊?为什么会有这样的提示呢? PHP怎么避免在登录后的页面中刷新时重新提交表单?怎么让服务器记住当前用户的登录状态啊? php怎样防止刷新重复提交? PHP不刷新提交数据,求大神帮写hello.php代码 如何在不刷新php页面的情况下,用php执行一些数据库操作 PHP用JS 提交表单 提交到当前页面但是不刷新当前页面 有什么办法? 最好给出代码!~ 提交表单的时候大家有什么防止用户刷新重复提交的方法 - PHP进阶讨论