PHP多进程编程(一)

虽然PHP 中,多进程用的比较的少。但是毕竟可能是会用到了。我最近就遇到这样一个问题,用户提交几百个url以后,要读出这个url 中的标题。

当然,你不希望用户等待的太久,10s 钟应该给出个答案。但是,本身,你要获取一个url 的标题,少的要 0.1s ,多的要好几秒。

显然,采用单个线程的方式是不行的。

我的第一个设计方案是这样的:

1. 用我前面提供的代码提供一个简单的服务器:  http://www.cnblogs.com/niniwzw/archive/2009/09/27/1575002.html

这个服务器的作用是:提供一个url,然后,就读取标题。这里,可以每次读128个字节,看看有没有读到title,如果读到title了就停止读了。

这样可以省带宽。

2. 在客户端,同时打开1百个 socket ,访问这个服务器。如果提供的url数目超过100,那么就多次运行。

这个方案,基本上能够满足要求,读比较快的网页如:google.com 100次,也只要1s 左右。但是,通过测试,发现,有一定

的概率在打开链接的时候被阻塞。(有时候会阻塞个1s左右,然后继续往下open)可能打开了太多的链接了,会出很大的问题。

当然,这是一个很差的解决方案:建立tcp 链接本身的消耗非常的大。因为可靠有序传输的要求,要维持一个数据结构,而且,系统还要开辟一定的缓存给客户端和服务器端,

用户缓存数据。如果建立上百个链接,就可能占用很大的内存。作为一个系统的服务,应该尽量的简单,就是,我叫你做什么事情,你做好以后,结果给我就可以了。

一般来说,PHP要进行多进程编程,比较常见的是:

1. 要进行大量的网络耗时的操作

2. 要做大量的运算,并且,系统有多个cpu,为了让用户有更快的体验,把一个任务,分成几个小任务,最后合并。

所以,应该尽量不要在调用的地方有太多复杂的逻辑,把逻辑内置在服务中。

我的第二个设计方案是这样的:

同样用上面的服务器,只是,这个服务器功能变了,接收不超过100个的url,然后打开100个子线程,下载title。最后合并,返回给客户端。

具体怎么编写这个服务器,在下一个部分讲。

这个一测试,发现效率高了很多。而且也十分的稳定。下载一百下google 大概 0.7s。基本上不会超过1s,而原来的那个方案,经常超过5s(20%的可能性)

当然,如果这样的设计方案只是一个很简单的解决方案。如果有很多人使用你的服务的情况下,肯定不能这样做。

PHP做企业级别的开发,一个比较复杂的问题,就是内存怎么处理。还有就是往往采用数组 会引起内存急剧膨胀。一般,数组处理10万条数据已经是极限,

在小网站开发很少会用到一次读取如此大的数据量,要是遇到了,最好通过C 扩展进行解决,否则,一次会损耗 几百M 的内存,10个人用就拖死你。

时间: 2024-10-12 20:30:04

PHP多进程编程(一)的相关文章

Linux下的多进程编程

1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 1.2进程的概念 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text

Python的多进程编程

考虑到多线程,都在一个主进程中共享栈变量,在操作同一个局部变量时可能出现絮乱的现象,即使加锁也容易出现死锁的现象,小编在这里再次记录下多进程编程,废话不多说,直接上代码: #!/usr/bin/env python #encoding: utf-8 import multiprocessing import time def process_one(interval): n =5 while n >0: print ("the time is {0}".format(time.c

多进程编程总述

1.进程创建:fork函数族 fork()和vfork()函数的区别: (1) fork ( ):子进程拷贝父进程的数据段,代码段 vfork( ):子进程与父进程共享数据段 (2) fork( )父子进程的执行次序不确定 vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec或exit 之后父进程才可能被调度运行.也就是说父进程在子进程调用exec或exit函数族之前一直保持阻塞. (3) vfork( )保证子进程先运行,在它调用exec 或ex

多进程编程的优缺点

转自原文 多进程编程的优缺点 多进程优点: 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系: 通过增加CPU,就可以容易扩充性能: 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系: 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大 多线程缺点: 逻辑控制复杂,需要和主程序交互: 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送.密集运算 多进程调度开销比较大: 最好是多进程和多线程结合,即根据实际的需要,每个CP

Linux高性能服务器编程——多进程编程

多进程编程 多进程编程包括如下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及如何避免僵尸进程 进程间通信(Inter-Process Communication,IPC)最简单的方式:管道 3种进程间通信方式:信号量,消息队列和共享内存 fork系统调用 #include<unistd.h> pid_tfork(void); 该函数的每次都用都返回两次,在父进程中返回的是子进程的PID,在子进程中返回的是0.该返回值是后续代码判断当前进程是父进程还

PHP多进程编程(2):管道通信

一个进程如果是个人英雄主义,那么多进程就是集体主义.(不严格区分多进程 和 多线程的差别) 你不再是一个独行侠,而是一个指挥家. 独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高. 这就是我对多进程的理解.多线程编程的主要问题是:通信 和 同步问题. 更多PHP 多线程编程的背景知识见: PHP多进程编程(一) 在PHP 中,如果光用pcntl ,实现比较简单的通信问题都是很困难的. 下面介绍管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.

Android 多进程编程 15问15答!

ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多.Socket很少有人用,这里给出一个利用Socket进行ipc通信的例子. 服务端代码: 1 package com.example.administrator.socketipcdemo; 2 3 import android.app.Service; 4 import android.conte

多进程编程

1.多进程 一个程序的执行活动,就是一个进程,系统为这个进程分配独立的地址空间,资源等等,所以进程事实上就是一个资源的集合体.进程就是为多道编程服务的,通过系统的调度,使得系统可以执行多个进程,使得多个进程看起来都可以同时被系统执行. 多进程编程主要的内容包括进程的控制和进程间的通信. 1.1 进程的控制 1.1.1 进程的创建 pid_t fork(void) fork()被调用一次,却返回两次,可能的返回值: 1.在父进程中,fork 返回新创建的子进程的的 PID 2.在子进程中,fork

嵌入式linux多进程编程

在主程序显示文本菜单,提供如下服务,要求每个服务都通过生成子进程来提供. 服务包括:日历信息显示,日期信息显示,判断闰年服务,文件复制功能,数字排序功能,退出功能. 代码和文档(有流程图的下载地址):http://download.csdn.net/download/jingjingxujiayou/7540893 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <tim