PHP多进程编程实例说明

 更新时间:2016年11月25日 17:07  点击:1903
使用PHP真正的多进程运行模式,适用于数据采集、邮件群发、数据源更新、tcp服务器等环节。

PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。 PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。

常用的PCNTL函数

   1. pcntl_alarm ( int $seconds )

      设置一个$seconds秒后发送SIGALRM信号的计数器
   2. pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )

      为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
declare(ticks = 1);

function signal_handler($signal) {
print “Caught SIGALRMn”;
pcntl_alarm(5);
}

pcntl_signal(SIGALRM, “signal_handler”, true);
pcntl_alarm(5);

for(;;) {
}

?>

   3. pcntl_exec ( string $path [, array $args [, array $envs ]] )

      在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
$dir = '/home/shankka/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';

$arg = array($cmd, $option, $dir);

pcntl_exec($pathtobin, $arg);
echo '123'; //不会执行到该行
?>

   4. pcntl_fork ( void )

      为当前进程创建一个子进程,并且先运行父进程,返回的是子进程的PID,肯定大于零。在父进程的代码中可以用 pcntl_wait(&$status)暂停父进程知道他的子进程有返回值。注意:父进程的阻塞同时会阻塞子进程。但是父进程的结束不影响子进程的运行。

      父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子进程)。在子进程的代码块中最好有exit语句,即执行完子进程后立即就结束。否则它会又重头开始执行这个脚本的某些部分。

      注意两点:
      1. 子进程最好有一个exit;语句,防止不必要的出错;
      2. pcntl_fork间最好不要有其它语句,例如:
$pid = pcntl_fork();
//这里最好不要有其他的语句
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}

   5. pcntl_wait ( int &$status [, int $options ] )

      阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
      1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
      2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
   6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )

      功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait 一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。

      例如:

       $pid = pcntl_fork();
if($pid) {
pcntl_wait($status);
$id = getmypid();
echo “parent process,pid {$id}, child pid {$pid}n”;
}else{
$id = getmypid();
echo “child process,pid {$id}n”;
sleep(2);
}
?>

      子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
   7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )

      取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
   8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )

      设置进程的优先级。
   9. posix_kill

      可以给进程发送信号
  10. pcntl_singal

      用来设置信号的回调函数

当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这个消息:

   1. 当父进程退出时,会有一个INIT进程来领养这个子进程。这个INIT进程的进程号为1,所以子进程可以通过使用getppid()来取得当前父进程的pid。如果返回的是1,表明父进程已经变为INIT进程,则原进程已经推出。
   2. 使用kill函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的存在性进行检查,而不会真的发送信号。所以,如果这个函数返回-1表示父进程已经退出。

除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或socket来进行时时的监控等等。

PHP多进程采集数据的例子

/**
* Project: Signfork: php多线程库
* File: Signfork.class.php
*/

class Signfork{
/**
* 设置子进程通信文件所在目录
* @var string
*/
private $tmp_path='/tmp/';

/**
* Signfork引擎主启动方法
* 1、判断$arg类型,类型为数组时将值传递给每个子进程;类型为数值型时,代表要创建的进程数.
* @param object $obj 执行对象
* @param string|array $arg 用于对象中的__fork方法所执行的参数
* 如:$arg,自动分解为:$obj->__fork($arg[0])、$obj->__fork($arg[1])…
* @return array 返回 array(子进程序列=>子进程执行结果);
*/
public function run($obj,$arg=1){
if(!method_exists($obj,'__fork')){
exit(“Method '__fork' not found!”);
}

if(is_array($arg)){
$i=0;
foreach($arg as $key=>$val){
$spawns[$i]=$key;
$i++;
$this->spawn($obj,$key,$val);
}
$spawns['total']=$i;
}elseif($spawns=intval($arg)){
for($i = 0; $i < $spawns; $i++){
$this->spawn($obj,$i);
}
}else{
exit('Bad argument!');
}

if($i>1000) exit('Too many spawns!');
return $this->request($spawns);
}

/**
* Signfork主进程控制方法
* 1、$tmpfile 判断子进程文件是否存在,存在则子进程执行完毕,并读取内容
* 2、$data收集子进程运行结果及数据,并用于最终返回
* 3、删除子进程文件
* 4、轮询一次0.03秒,直到所有子进程执行完毕,清理子进程资源
* @param string|array $arg 用于对应每个子进程的ID
* @return array 返回 array([子进程序列]=>[子进程执行结果]);
*/
private function request($spawns){
$data=array();
$i=is_array($spawns)?$spawns['total']:$spawns;
for($ids = 0; $ids<$i; $ids++){
while(!($cid=pcntl_waitpid(-1, $status, WNOHANG)))usleep(30000);
$tmpfile=$this->tmp_path.'sfpid_'.$cid;
$data[$spawns['total']?$spawns[$ids]:$ids]=file_get_contents($tmpfile);
unlink($tmpfile);
}
return $data;
}

/**
* Signfork子进程执行方法
* 1、pcntl_fork 生成子进程
* 2、file_put_contents 将'$obj->__fork($val)'的执行结果存入特定序列命名的文本
* 3、posix_kill杀死当前进程
* @param object $obj 待执行的对象
* @param object $i 子进程的序列ID,以便于返回对应每个子进程数据
* @param object $param 用于输入对象$obj方法'__fork'执行参数
*/
private function spawn($obj,$i,$param=null){
if(pcntl_fork()===0){
$cid=getmypid();
file_put_contents($this->tmp_path.'sfpid_'.$cid,$obj->__fork($param));
posix_kill($cid, SIGTERM);
exit;
}
}
}
?>

php在pcntl_fork()后生成的子进程(通常为僵尸进程)必须由pcntl_waitpid()函数进行资源释放。但在 pcntl_waitpid()不一定释放的就是当前运行的进程,也可能是过去生成的僵尸进程(没有释放);也可能是并发时其它访问者的僵尸进程。但可以使用posix_kill($cid, SIGTERM)在子进程结束时杀掉它。

子进程会自动复制父进程空间里的变量。

PHP多进程编程示例2

//…..
//需要安装pcntl的php扩展,并加载它
if(function_exists(“pcntl_fork”)){
//生成子进程
$pid = pcntl_fork();
if($pid == -1){
die('could not fork');
}else{
if($pid){
$status = 0;
//阻塞父进程,直到子进程结束,不适合需要长时间运行的脚本,可使用pcntl_wait($status, 0)实现非阻塞式
pcntl_wait($status);
// parent proc code
exit;
}else{
// child proc code
//结束当前子进程,以防止生成僵尸进程
if(function_exists(“posix_kill”)){
posix_kill(getmypid(), SIGTERM);
}else{
system('kill -9'. getmypid());
}
exit;
}
}
}else{
// 不支持多进程处理时的代码在这里
}
//…..
?>

如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:

pcntl_wait($status, 1);
//或
pcntl_wait($status, WNOHANG);

在上面的代码中,如果父进程退出(使用exit函数退出或redirect),则会导致子进程成为僵尸进程(会交给init进程控制),子进程不再执行。

僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。任何进程在退出前(使用exit退出) 都会变成僵尸进程(用于保存进程的状态等信息),然后由init进程接管。如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多,最后系统就没有可以用的进程表项,于是也无法再运行其它的程序。

预防僵尸进程有以下几种方法:

   1. 父进程通过wait和waitpid等函数使其等待子进程结束,然后再执行父进程中的代码,这会导致父进程挂起。上面的代码就是使用这种方式实现的,但在WEB环境下,它不适合子进程需要长时间运行的情况(会导致超时)。

      使用wait和waitpid方法使父进程自动回收其僵尸子进程(根据子进程的返回状态),waitpid用于临控指定子进程,wait是对于所有子进程而言。
   2. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
   3. 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号,例如:

pcntl_signal(SIGCHLD, SIG_IGN);
$pid = pcntl_fork();
//….code

4. 还有一个技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程再fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面是一个例子:

#include “apue.h”
#include
int main(void){
pid_t pid;

if ((pid = fork()) < 0){
err_sys(“fork error”);
} else if (pid == 0){ /**//* first child */
if ((pid = fork()) < 0){
err_sys(“fork error”);
}elseif(pid > 0){
exit(0); /**//* parent from second fork == first child */
}

/**
* We're the second child; our parent becomes init as soon
* as our real parent calls exit() in the statement above.
* Here's where we'd continue executing, knowing that when
* we're done, init will reap our status.
*/
sleep(2);
printf(“second child, parent pid = %d “, getppid());
exit(0);
}

if (waitpid(pid, NULL, 0) != pid) /**//* wait for first child */
err_sys(“waitpid error”);

/**
* We're the parent (the original process); we continue executing,
* knowing that we're not the parent of the second child.
*/
exit(0);
}

      在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init会定期调用wait回收清理这些父进程已退出的僵尸子进程。

      所以,上面的示例可以改成:

       //…..
//需要安装pcntl的php扩展,并加载它
if(function_exists(“pcntl_fork”)){
//生成第一个子进程
$pid = pcntl_fork(); //$pid即所产生的子进程id
if($pid == -1){
//子进程fork失败
die('could not fork');
}else{
if($pid){
//父进程code
sleep(5); //等待5秒
exit(0); //或$this->_redirect('/');
}else{
//第一个子进程code
//产生孙进程
if(($gpid = pcntl_fork()) < 0){ ////$gpid即所产生的孙进程id
//孙进程产生失败
die('could not fork');
}elseif($gpid > 0){
//第一个子进程code,即孙进程的父进程
$status = 0;
$status = pcntl_wait($status); //阻塞子进程,并返回孙进程的退出状态,用于检查是否正常退出
if($status ! = 0) file_put_content('filename', '孙进程异常退出');
//得到父进程id
//$ppid = posix_getppid(); //如果$ppid为1则表示其父进程已变为init进程,原父进程已退出
//得到子进程id:posix_getpid()或getmypid()或是fork返回的变量$pid
//kill掉子进程
//posix_kill(getmypid(), SIGTERM);
exit(0);
}else{ //即$gpid == 0
//孙进程code
//….
//结束孙进程(即当前进程),以防止生成僵尸进程
if(function_exists('posix_kill')){
posix_kill(getmypid(), SIGTERM);
}else{
system('kill -9'. getmypid());
}
exit(0);
}
}
}
}else{
// 不支持多进程处理时的代码在这里
}
//…..
?>

怎样产生僵尸进程的
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。

如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。

另外,还可以写一个php文件,然后在以后台形式来运行它,例如:

//Action代码
public function createAction(){
//….
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>

然后在insertLargeData.php文件中做数据库操作。也可以用cronjob + php的方式实现大数据量的处理。

如果是在终端运行php命令,当终端关闭后,刚刚执行的命令也会被强制关闭,如果你想让其不受终端关闭的影响,可以使用nohup命令实现:

//Action代码
public function createAction(){
//….
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('nohup php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>

你还可以使用screen命令代替nohup命令。

本文章来给各位同学介绍php数组保存文本与文本反编成数组方法,有需要了解的同学可进入参考。

实例

 

 代码如下 复制代码

function string2array($data) { 
if($data == '') return array();
 @eval("$array = $data;"); return $array;

}

/** 将数组转换为字符串

 代码如下 复制代码

* @param    array   $data       数组
* @param    bool    $isformdata 如果为0,则不使用new_stripslashes处理,可选参数,默认为1
* string  返回字符串,如果,data为空,则返回空  */

function array2string($data, $isformdata = 1) {
 if($data == '') return '';
 if($isformdata) $data = new_stripslashes($data);
 return addslashes(var_export($data, TRUE));
}

本文章来给大家介绍我们在提交表单时如果表单使用的是get方式,然后我们利用get获取到的会是乱码,下面我来看看是如何解决此问题的。

本来打算这样使用

 代码如下 复制代码

<a href="list.php?plate=辖区动态" charset="utf-8" target="main">[查看辖区动态]</a>

结果在list.php页面得到的是—–查看[辖区动怿]

我想可能是汉字的“态"这个编码和某些东西冲突了,所以。。。

我找到了网上这样解决:

使用:

 代码如下 复制代码

<a href="list.php?plate=<?php echo urlencode(“辖区动态");?>" charset="utf-8" target="main">[查看]</a>

然后在list.php页面这样用

 代码如下 复制代码

$plate=urldecode($_GET['plate']);

也就不会乱码和传递不正常了


关于string urlencode ( string $str )函数

此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

Example #1 urlencode() 例子

 代码如下 复制代码

<?php
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>

Example #2 urlencode() 与 htmlentities() 例子

 代码如下 复制代码

<?php
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo '<a href="mycgi?' . htmlentities($query_string) . '">';
?>

在php中substr(),mb_substr()及mb_strcut三个函数都是字符截取函数,但是substr截取中文时会有乱码,而后两者支持中文截取,下面我来介绍介绍。

substr()函数

substr(string,start,length)

string表示要截取的对象,start表示从哪个位置开始截取,0表示从头开始,正数表示从这个数的位置后面截取,负数表示从结尾算开始截取的位置,但依然是从左到右截,length表示截取长度.负数表示排除或忽略结尾多少个字符.比如:

 代码如下 复制代码
<?php
$siteurl = 'www.111cn.net';
print_r (substr($siteurl,4));exit;

//则返回:  111cn.net表示从头第4个字符开始,返回后面的所有字符.

 代码如下 复制代码

<?php
$siteurl = 'www.111cn.net';
print_r (substr($siteurl,-6,2));exit;

如果要截取双字节的汉字.则要用PHP mb_substr函数或mb_strcut函数,但这两个函数依赖php扩展php_mbstring.dll组件,所以要配置你的服务器.即把php安装目录中的php_mbstring.dll文件复制到你的windows 2003 的c盘的Windows/system32目录中.


举个例子:

 代码如下 复制代码

<?php
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>

输出:这样一来我的字

 代码如下 复制代码

<?php
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>

输出:这样一

从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象……

 代码如下 复制代码

<?php
echo mb_substr('飞花院博客feihuayuan',0,9);
//返回: 飞花院

echo mb_substr('飞花院博客feihuayuan',0,9,'utf-8');
//则返回: 飞花院博客feih

mb_strcut('飞花院博客feihuayuan',0,9,'utf-8');
则返回:飞花院
?>

再举个例子,有一段文字, 分别用mb_substr和mb_strcut来做切分:

PLAIN TEXT
CODE:

 代码如下 复制代码

<?php
$str = '我是一串比较长的中文-';

echo "mb_substr:" . mb_substr($str, 0, 6, 'utf-8');

echo "<br>";

echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');
?>

输出结果如下:

mb_substr:我是一串比较
mb_strcut:我是

本文章总结

从上面实例可以看得出来,substr只支持单字节的,这样只适合英文截取,而mb_substr函数是双字体截取了,正好可用于中文了,而mb_strcut是三字节了。

在php中error_reporting是设置 PHP 的报错级别并返回当前级别,我们可以根据不同级别来设置是不给出错误提示域外出错时是否向往执行程序,下面我来介绍error_reporting()用法与参数。

基本信息

E_NOTICE 表示一般情形不记录,只有程序有错误情形时才用到,例如企图存取一个不存在的变量,或是呼叫 stat() 函数检视不存在的文件。
E_WARNING 通常都会显示出来,但不会中断程序的执行。这对除错很有效。例如:用有问题的正则表达式呼叫 ereg()。
E_ERROR 通常会显示出来,亦会中断程序执行。意即用这个遮罩无法追查到内存配置或其它的错误。
E_PARSE 从语法中解析错误。
E_CORE_ERROR 类似 E_ERROR,但不包括 PHP 核心造成的错误。
E_CORE_WARNING 类似 E_WARNING,但不包括 PHP 核心错误警告。

例子:

error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示错

error_reporting=E_ERROR :只会报告致命性错误

基本上设置

error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒


例子

 代码如下 复制代码


error_reporting(0);
 
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
 
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
 
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
 
// Report all PHP errors (bitwise 63 may be used in PHP 3)
error_reporting(E_ALL);
 
// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

整数。表示旧的PHP的错误级别。(Returns the old error_reporting level.)
手册上的例子:

Value Constant Description Note
1 E_ERROR (integer) Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted.  
2 E_WARNING (integer) Run-time warnings (non-fatal errors). Execution of the script is not halted.  
4 E_PARSE (integer) Compile-time parse errors. Parse errors should only be generated by the parser.  
8 E_NOTICE (integer) Run-time notices. Indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script.  
16 E_CORE_ERROR (integer) Fatal errors that occur during PHP’s initial startup. This is like an E_ERROR, except it is generated by the core of PHP. since PHP 4
32 E_CORE_WARNING (integer) Warnings (non-fatal errors) that occur during PHP’s initial startup. This is like an E_WARNING, except it is generated by the core of PHP. since PHP 4
64 E_COMPILE_ERROR (integer) Fatal compile-time errors. This is like an E_ERROR, except it is generated by the Zend Scripting Engine. since PHP 4
128 E_COMPILE_WARNING (integer) Compile-time warnings (non-fatal errors). This is like an E_WARNING, except it is generated by the Zend Scripting Engine. since PHP 4
256 E_USER_ERROR (integer) User-generated error message. This is like an E_ERROR, except it is generated in PHP code by using the PHP function trigger_error(). since PHP 4
512 E_USER_WARNING (integer) User-generated warning message. This is like an E_WARNING, except it is generated in PHP code by using the PHP function trigger_error(). since PHP 4
1024 E_USER_NOTICE (integer) User-generated notice message. This is like an E_NOTICE, except it is generated in PHP code by using the PHP function trigger_error(). since PHP 4
2048 E_STRICT (integer) Run-time notices. Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code. since PHP 5
4096 E_RECOVERABLE_ERROR (integer) Catchable fatal error. It indicates that a probably dangerous error occured, but did not leave the Engine in an unstable state. If the error is not caught by a user defined handle (see also set_error_handler()), the application aborts as it was an E_ERROR. since PHP 5.2.0
8191 E_ALL (integer) All errors and warnings, as supported, except of level E_STRICT in PHP < 6. 6143 in PHP 5.2.x and 2047 previously

[!--infotagslink--]

相关文章

  • c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
  • C#启动进程的几种常用方法

    这篇文章主要介绍了C#启动进程的几种常用方法,实例分析了C#对系统进行的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 浅谈node.js中async异步编程

    1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
  • C#获取所有进程的方法

    在本篇文章里小编给大家分享了关于C#获取所有进程的方法和步骤,有需要的朋友们跟着学习参考下。...2020-06-25
  • C#编程总结(六)详解异步编程

    本篇文章主要介绍了C#异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...2020-06-25
  • C#获取进程的主窗口句柄的实现方法

    C#获取进程的主窗口句柄的实现方法,需要的朋友可以参考一下...2020-06-25
  • C#使用SendMessage实现进程间通信的方法

    这篇文章主要介绍了C#使用SendMessage实现进程间通信的方法,涉及C#中SendMessage方法的使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • 理解javascript异步编程

    这篇文章主要为大家介绍了javascript异步编程,从浅入深的学习javascript异步编程,对javascript异步编程感兴趣的小伙伴们可以参考一下...2016-01-29
  • C#中进程的挂起与恢复

    这篇文章主要介绍了C#中进程的挂起与恢复操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 基于RequireJS和JQuery的模块化编程——常见问题全面解析

    下面小编就为大家带来一篇基于RequireJS和JQuery的模块化编程——常见问题全面解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-04-17
  • 读Javascript高性能编程重点笔记

    这篇文章主要介绍了读Javascript高性能编程重点笔记,需要的朋友可以参考下...2016-12-31
  • 简单掌握Windows中C#启动外部程序进程的方法

    这篇文章主要介绍了Windows中C#启动外部程序进程的方法,例子中同时包括了进程关闭的方法,需要的朋友可以参考下...2020-06-25
  • 再谈JavaScript异步编程

    再谈JavaScript异步编程,简单描述了几种JavaScript异步编程模式,感兴趣的小伙伴们可以参考一下...2016-01-29
  • 详解C语言进程同步机制

    这篇文章主要介绍了详解C语言进程同步机制的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-06-18
  • 探究JavaScript函数式编程的乐趣

    本文是函数式编程系列的第一篇文章,这里我会简要介绍一下编程范式,然后会直接介绍使用Javascript进行函数式编程的概念,需要的朋友可以参考下...2015-12-16
  • 用PHP与XML联手进行网站编程

    一、小序 HTML简单易学又通用,一般的PHP程序就是嵌入在HTML语言之中实现的。但是随着WEB越来越广泛的应用,HTML的弱点也越来越明显了。XML的出现,弥补了这些不足,它提供...2016-11-25
  • Go语言七篇入门教程六网络编程

    这篇文章主要为大家介绍了Go语言的网络编程,其中包含了Socket编程,Http编程以及RPC编程,本篇文章是Go语言七篇入门系列文章,有需要的朋友可以借鉴下...2021-11-10
  • c#并行编程示例分享

    这篇文章主要介绍了c#并行编程示例,大家直接看下面的代码吧...2020-06-25
  • 深入浅析WinForm 进程、线程及区别介绍

    进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。这篇文章主要介绍了WinForm 进程、线程的相关资料,需要的朋友可以参考下...2021-09-22
  • C#并发编程入门教程之概述

    这篇文章主要给大家介绍了关于C#并发编程之概述的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25