如何在PHP中利用pcntl_fork实现一个多进程下载功能

介绍

如何在PHP中利用pcntl_fork实现一个多进程下载功能吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

PHP pcntl_fork——在当前进程当前位置产生分支,子进程,译注:叉是创建了一个子进程,父进程和子进程都从叉的位置开始向下继续执行,不同的是父进程执行过程中,得到的叉返回值为子进程号,而子进程得到的是0。

注意:PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展。

1。首先在ubuntu下编译pcntl。所以,我的ubuntu下找不到pcntl的包,于是创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令,代码如下:

# mkdir php 

# cd PHP
# apt-get源php5
# cd php5 - (WHATEVER_RELEASE)/ext/pcntl phpize
#
# ./configure(注一)
#让
# make install phpize命令是用来准备PHP外挂模块的编译环境的

成功的安装将建立extname。所以并放置于PHP的外挂模块目录中(预设存放于/usr/lib/php/modules/内),需要调整PHP。ini,加入=extname延伸。所以这一行之后才能使用此外挂模块。

例:

空白pcntl_exec $ path (string[,数组$ args[,数组$ env]])

pcntl_exec——在当前进程空间执行指定程序,代码如下:

$ cmds=阵列(,

,,,,,,,数组(& # 39;/home/杰瑞/项目/www/test2.php& # 39;),
,,,,,,,数组(& # 39;/home/杰瑞/项目/www/test3.php& # 39;)
);
,
foreach (cmds cmd美元美元){
,,,,,,,$ pid=pcntl_fork ();
,,,,,,,如果($ pid==1) {
,,,,,,,//进程创建失败
,,,,,,,,,,,回声& # 39;创建子进程失败时返回1 & # 39;;
,,,,,,,,,,,退出(1);
,,,,,,,}
,,,,,,,else if ($ pid) {
,,,,,,,//父进程会得到子进程号,所以这里是父进程执行的逻辑
,,,,,,,,,,,pcntl_wait(美元地位,WNOHANG);
,,,,,,,}
,,,,,,,其他{
,,,,,,,//子进程处理逻辑
,,,,,,,,,,,睡眠(5);
,,,,,,,,,,,pcntl_exec (& # 39;/usr/bin/php # 39;, cmd美元);
,,,,,,,,,,,退出(0);
,,,,,,,}
}


例,实例多图片同步下载,代码如下:

# !/usr/bin/php 

& lt; ?php
//需要抓取的网页地址
$ url=& # 39; https://www.jb51.net& # 39;;
$内容=file_get_contents ($ url);
preg_match_all (& # 39;/& lt;一个+ src=https://www.yisu.com/zixun/?. * ?)“/?内容,美元$ matches, PREG_SET_ORDER);
回声“已发现“.count ($ matches) !”张图片n";
,
列表(sm, ss)美元=爆炸(““());
foreach ($ matches k=美元比;美元val)
{
, $ pid ($ k)=pcntl_fork ();
,如果(! $ pid [$ k])
, {
,下载(url, val美元);
,//子进程要退出否则会进行递归多进程,父进程不要退出否则终止多进程
,退出(0);
,}
,
,如果($ pid [$ k])
, {
//,,,pcntl_waitpid (pid ($ k),美元地位,WUNTRACED);
,}
,
}
回声“下载完成n";
,
列表(em, es)美元=爆炸(““());
,
回声“用时:“,(es + em美元)——(ss + sm美元),“n";
/* *
, *抓取网页图片
, *,
, */
功能下载(url, val美元)
{
, pic_url=val美元[1];
,如果(大小写敏感(val[1]美元,& # 39;//& # 39;)!==false)
, {
,;
,}
, elseif (preg_match (& # 39; @ ^ (. * ?)/@ # 39;, val[1]美元,美元inner_matches)==0)
, {
,pic_url=$ url。瓦尔美元[1];
,}
, elseif (preg_match (& # 39; @ [:] @ # 39;, inner_matches美元[1],tmp_matches美元)==0)
, {
,pic_url=$ url。瓦尔美元[1];
,}
,
,美元图片=file_get_contents (pic_url美元);
,
,如果($图片===false)
, {
,返回;
,}
,
, preg_match (& # 39; @/([^/] +) $ @ # 39;, pic_url美元,美元tmp_matches);
,//可使用断言处理异常
, pic_file_name=tmp_matches美元[1];
, $ f=fopen (“tmp/啊ic_file_name美元,“wb");#
,写入文件(f,美元图片);
,文件关闭($ f);
}
,
/*文件pcntl_fork结束。php */
?在

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

如何在PHP中利用pcntl_fork实现一个多进程下载功能