用php编写守护进程

在此之前,需要知道守护进程这个概念,知道之后,才可以用php来编写守护进程。那么创建守护进程需要有下面这几个步骤。

1.创建子进程,父进程退出

父进程先与子进程退出,子进程则会被1号进程收养,这个子进程就会成为init的子进程

php使用pcntl_fork()来创建子进程。

pcntl_fork()返回一个整型值,在父进程里面返回的是子进程的id,子进程返回的是0,失败则返回-1。这样我们就可以根据这个来分别控制父进程和子进程执行任务。

2.子进程创建会话

这个是重要的一步,在这一步中该子进程会做这些事情:1.让进程摆脱原会话的控制;2.让进程摆脱员进程组的控制;3.让进程摆脱终端的控制。

为什么要这样?这个在守护进程介绍里面有

php这里使用posix_setsid()来在这个子进程中创建会话,使得这个进程成为会话组组长 (更多…)

你可能还喜欢下面这些文章

php多进程编程:第一次fork

工作原因,要用到php多进程,于是粗略的了解一下,完成之后把过程记录下来,整理成教程,希望对学习php多进程编程的程序员有所帮助。前言使用php cli的时候,我们在终端会这样php hello.php运行一个hello.php程序,这样linux会为我们创建一个进程。不考虑 nohup ,在一个终端,我们以cli方式运行的php程序也只能有这一个进程。一个进程处理的任务必定是有限的,在系统资源空闲那么多的情况下,为什么不使用多进程来提高效率呢?不过php多进程需要安装pcntl和posix扩展(windows不支持)fork,创建子进程创建子进程的方法就是fork,在php里面,这个函数是p

守护进程介绍

1.守护进程概述守护进程,也就是通常所说的daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地 执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护进程实 现的。同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是daemon的意思)。由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的 控制终端,当控制终端被关闭时,相应的进程都

php的empty,isset,is_null与!

来说说php的empty,isset,is_null 与!,这几个都是if语句中比较常见的判断逻辑。但是有时候用的很纠结,甚至看别人写的程序里面也很纠结。特地梳理梳理,避免踩坑

先来定义一些东西

<?php
$a;
$b=0;
$c=array();
$d='';
$e=null;

empty,用了会上瘾

这是一个用了会上瘾的语言结构! (更多…)

php运算符的优先级

无论在哪个语言,运算符都有优先级,就如四则运算一样。先乘除后加减,但语言的运算可不止四则。代码写的越多,越觉得运算符的优先级重要性(请原谅我是一个野生程序员)。记住运算符的优先级,能让你少些很多括号,也能体现你的水平,别闹笑话了(在有一个加法和一个乘法的式子中,还特地把乘法用括号括起来,这不是闹笑话吗)。更能够让那种无厘头的bug消失!

(更多…)

你可能还喜欢下面这些文章

看看php的boolean都有哪些,以及其有趣的用法

在写if的时候,在写while的时候,总感觉不写一个true或者false就难受。是的,你还不明确php里面都有哪些值是true,哪些值是false!除了false的,都是true!php里面为false的东西 布尔值 FALSE 本身 整型值 0(零) 浮点型值 0.0(零) 空字符串,以及字符串 “0” 不包括任何元素的数组 不包括任何成员变量的对象(仅 PHP 4.0 适用) 特殊类型 NULL(包括尚未赋值的变量) 从空标记生成的 SimpleXML 对象 既然说了除了false以外的都是true了,那么就别天真的以为-1是false了,它也是true。有

Shell中的条件判断语句if的用法

shell中的if语法是最让我头疼的语法之一,它的判断就向使用USB插头一样——拿起来插入不行,翻转再插入还不行,再翻转插入行了!为了搞清楚这部分语言,我收集了一些文章关于if条件判断的用法,希望对你也有些帮助。一、基本语法if [ command ]; then 符合该条件执行的语句fiif [ command ];then 符合该条件执行的语句elif [ command ];then 符合该条件执行的语句else 符合该条件执行的语句fi语法说明bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语

bash教程:一、变量,函数,控制流程

变量的定义和使用变量的定义bash变量定义很简单。如下:a=”hello”左边是变量名,右边是变量值。bash是弱类型,因此不需要给a加上类型。注意,等号两边不能有空格 比如 a = “hello”,这是错误的。变量使用变量使用需要在定义的变量名之前加上$,比如我们打印之前定义的aecho $a特殊变量后面再说,现在仅仅是最基础的,能够让自己写出一个完整的脚本就行。流程控制流程控制则是编写程序必备的过程,比如顺序,循环,条件,分支等等。在其他类C语言中有if…else,for,while,do…while,switch,那么在bash里面,这些应该怎么写呢。if…else结构a=0

c语言的位操作

一、基本位操作|或&与~取反^异或<<左移>>右移二、位操作的常见用法1.获取某位的值#define BitGet(Number,pos) ((Number)|= 1<<(pos)) //把某位置1#define BitGet(Number,pos) ((Number) &= ~(1<<(pos)) //把某位置0#define BitGet(Number,pos) ((Number) >> (pos)&1)) //用宏得到某数的某位#define BitGet(Number,pos) ((Number) ^=

使用php curl 的并发能力可以做什么

在php中,没有多线程让编程变得简单。但在一些需要并发提升性能的场景下,显得有些无能为力,比如发起一些http请求。但好在curl扩展可以让我们“并发”去请求网络资源。利用这个特点,我们能做很多有趣的事情。最基础的,并发请求网络资源,提升处理速度。并发访问代码<?phpclass ConcurrencyHTTP { private $_requests; private $_callbacks; private $_currentIndex = 0; public function get($url, $header = array(), $timeout = 3

一个将网页里面的(图片,链接地址)相对路径转化为绝对路径的php实现方法

抓取网页的时候有时候会需要下载里面的图片或者其他附件,但有的网页里面用的是相对路径,这时候就要转化为绝对路径。

 
/**
* url补全,相对url转化为绝对url
* 作用是补全url
*/
function url2abs($srcurl,$baseurl){

  $srcinfo = parse_url($srcurl); 
  //print_r($srcinfo); 
  if(isset($srcinfo['scheme'])) {  
    return $srcurl;  
  }

  $baseinfo = parse_url($baseurl);  
  $url = $baseinfo['scheme'].'://'.$baseinfo['host'];  
  if(substr($srcinfo['path'], 0, 1) == '/') {  
    $path = $srcinfo['path'];  
  }else{  
    $path = dirname($baseinfo['path']).'/'.$srcinfo['path'];  
  }  
  $rst = array();  
  $path_array = explode('/', $path);  
  if(!$path_array[0]) {  
    $rst[] = '';  
  }
  foreach ($path_array AS $key => $dir) {  
    if ($dir == '..') {  
      if (end($rst) == '..') {  
        $rst[] = '..';  
      }elseif(!array_pop($rst)) {  
        $rst[] = '..';  
      }  
    }elseif($dir && $dir != '.') {  
      $rst[] = $dir;  
    }  
   }  
  if(!end($path_array)) {  
    $rst[] = '';  
  }  
  $url .= implode('/', $rst);
  if( !empty($srcinfo['query']) ) $url .= '?'.$srcinfo['query'];
  return str_replace('\\', '/', $url);
}

就这样吧,上代码,完事。代码不是我写的,看起来有点乱,哈哈,不关我事啦

你可能还喜欢下面这些文章

介绍一款工具,memcacheadmin,使用php制作的memcached管理监控工具

MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单。主要功能: 服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新 服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控 支持数据遍历,方便对存储内容进行监视 支持条件查询,筛选出满足条件的KEY或VALUE 数组、JSON等序列化字符反序列显示 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外) 支持服务器连接池,多服务器管理切换方便简洁guthub地址:https://github.com/ju

使用php curl 的并发能力可以做什么

在php中,没有多线程让编程变得简单。但在一些需要并发提升性能的场景下,显得有些无能为力,比如发起一些http请求。但好在curl扩展可以让我们“并发”去请求网络资源。利用这个特点,我们能做很多有趣的事情。最基础的,并发请求网络资源,提升处理速度。并发访问代码<?phpclass ConcurrencyHTTP { private $_requests; private $_callbacks; private $_currentIndex = 0; public function get($url, $header = array(), $timeout = 3

记一次进程异常退出的问题排查

机器搬家之后,之前一直稳定的PHP多进程程序子进程突然异常退出,但是退出的不是很频繁,查看进程日志并也没有发现有什么导致退出的,问题比较诡异。于是开启了一段问题排查之路。首先查看内核日志,使用dmesg,拉到最后发现有一些这样的错误,看来确实是崩溃了。[4791991.998535] php[16776]: segfault at 7f6443ee18c8 ip 00007f6443ee18c8 sp 00007fff4d4ba818 error 15 in libc-2.17.so[7f6443ee1000+2000][4792165.192628] php[609]: segfault a

php-fpm与fastcgi之间的关系

php-fpm与fastcgi名词解释php-fpm 全称为php fastcgi progress manager (php fastcgi 进程管理器)FastCGI全称为fast common gateway interface (Fast 通用网关接口)FastCGI是一种协议Fastcgi是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序都可以通过Fastcgi来提供Web服务。Fastcgi的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的,大多数Fastcg

让sublime支持php,python等脚本的执行

sublime有自己的Build系统,默认的快捷键是ctrl+b。只需要定制对应语言的执行命令,就可以支持各个语言的编译,执行了。这里对几种主流的脚本语言执行做一些教程。打开Tools->Build System -> New Build System  …插入对应的json格式的配置即可php{ “cmd”: [“php”, “$file”], “file_regex”: “php$”, “selector”: “source.php”}保存为php.sublime-build,这下执行php不用老是跑去刷网页了,也不用老是开cmd窗口了。python{  

php的file_get_contents()的高级用法

读取文件,读取网页,file_get_contents总是首选。既简单,又高效。

读取网页:

 $content = file_get_contents("http://imhuchao.com")

这里要说的是file_get_contents的一些”高级”的用法,平时大概用不上。

file_get_contents可以用来发送post请求,设定超时时间等等,不弱于curl。

函数说明是这样子的

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )

其中第三个参数$context能够让file_get_content发送post请求,控制超时等功能

先看一个简单地例子,下面是一个发送post数据的示例,并且设定超时时间为5s

 //发送的post数据
$data = array("hello"=>"1");
// 创建contentxt流
$opts = array(
 'http'=>array(
 'method'=>"POST",
 'content'=>http_build_query($data),
 'timeout'=>'5'
 )
);

$context = stream_context_create($opts);


$file = file_get_contents('http://www.example.com', false, $context);
?>

http context的参数项

http的context有这么一些参数,根据这些组合能让file_get_contents不弱于curl

method (string)
远程服务器支持的 GET,POST 或其它 HTTP 方法。

默认值是 GET。
header (string)
请求期间发送的额外 header 。在此选项的值将覆盖其他值 (诸如 User-agent:, Host: 和 Authentication:)。
user_agent string
要发送的 header User-Agent: 的值。如果在上面的 header context 选项中没有指定 user-agent,此值将被使用。

默认使用 php.ini 中设置的 user_agent。
content (string)
在 header 后面要发送的额外数据。通常使用POST或PUT请求。
proxy (string)
URI 指定的代理服务器的地址。(e.g. tcp://proxy.example.com:5100).
request_fulluri (boolean)
当设置为 TRUE 时,在构建请求时将使用整个 URI 。(i.e. GET http://www.example.com/path/to/file.html HTTP/1.0)。 虽然这是一个非标准的请求格式,但某些代理服务器需要它。

默认值是 FALSE.
follow_location (integer)
跟随 Location header 的重定向。设置为 0 以禁用。

默认值是 1。
max_redirects (integer)
跟随重定向的最大次数。值为 1 或更少则意味不跟随重定向。

默认值是 20。
protocol_version float
HTTP 协议版本。

默认值是 1.0。

Note:

PHP 5.3.0 以前的版本没有实现分块传输解码。 如果此值设置为 1.1 ,与 1.1 的兼容将是你的责任。
timeout (float)
读取超时时间,单位为秒(s),用 float 指定(e.g. 10.5)。

默认使用 php.ini 中设置的 default_socket_timeout。
ignore_errors (boolean)
即使是故障状态码依然获取内容。

默认值为 FALSE.

附录

file_get_contents的参数

filename
要读取的文件的名称。
use_include_path
Note:

As of PHP 5 the FILE_USE_INCLUDE_PATH can be used to trigger include path search.
context
A valid context resource created with stream_context_create(). 如果你不需要自定义 context,可以用 NULL 来忽略。
offset
The offset where the reading starts on the original stream.

Seeking (offset) is not supported with remote files. Attempting to seek on non-local files may work with small offsets, but this is unpredictable because it works on the buffered stream.
maxlen
Maximum length of data read. The default is to read until end of file is reached. Note that this parameter is applied to the stream processed by the filters.

你可能还喜欢下面这些文章

c语言中的define用法

作为代码中,第一个看到的,极有可能就是define这个东西,称为宏!(define是可以出现在任何地方的,但是我们一般把这个写到最开始)然而,很多时候,初学者有时候可能看不懂她,因此,我的c语言学习的第一篇就写这个啦。define基本用法,简单定义最浅显的,define能用一个有含义的字符来替代一些数字,比如#define PI 3.141592654这样,假如以后要计算圆的周长或者面积,就可以用PI这个字符而不用写3.141592654啦。比如#define PI 3.141592654#include “stdio.h”int main(){    int r = 3;    float

看看php的boolean都有哪些,以及其有趣的用法

在写if的时候,在写while的时候,总感觉不写一个true或者false就难受。是的,你还不明确php里面都有哪些值是true,哪些值是false!除了false的,都是true!php里面为false的东西 布尔值 FALSE 本身 整型值 0(零) 浮点型值 0.0(零) 空字符串,以及字符串 “0” 不包括任何元素的数组 不包括任何成员变量的对象(仅 PHP 4.0 适用) 特殊类型 NULL(包括尚未赋值的变量) 从空标记生成的 SimpleXML 对象 既然说了除了false以外的都是true了,那么就别天真的以为-1是false了,它也是true。有

linux命令:ls用法,列出文件及目录

原标题:每天一个linux命令(1):ls命令ls 命令是linux下最常用的命令。ls命令就是list的缩写缺省下ls用来打印出当前目录的清单,如果ls指定其他目录那么就会显示指定目录里的文 件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限),查看目录信息等等。ls 命令在日常的linux操作中用的很多!ls命令格式ls [选项] [目录名]命令功能列出目标目录中所有的子目录和文件。常用参数-a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件-A 同-a,但不列出“.”(表示当前目录)和“..”(表示当

linux awk命令分析你的文本或日志,awk命令用法

简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您

使用php curl 的并发能力可以做什么

在php中,没有多线程让编程变得简单。但在一些需要并发提升性能的场景下,显得有些无能为力,比如发起一些http请求。但好在curl扩展可以让我们“并发”去请求网络资源。利用这个特点,我们能做很多有趣的事情。最基础的,并发请求网络资源,提升处理速度。并发访问代码<?phpclass ConcurrencyHTTP { private $_requests; private $_callbacks; private $_currentIndex = 0; public function get($url, $header = array(), $timeout = 3

php print 这个坑,遇到连接符从右往左执行

在使用php的时候,我很少用到print这个函数,哦,不对,这是一个语言结构,而并非日函数!

看一段代码

<?php  print('a').print('b').print('c');

这个会输出什么?

大多数人的直觉肯定是abc,但如果你运行一下,你会发现输出的是:cb1a1。 (更多…)

你可能还喜欢下面这些文章

python学习笔记:二、 流程控制

根据如何学习一门新的语言这篇文章的指导,现在的步骤就是学习这门语言的流程控制了。通常来讲,流程控制有顺序,选择,循环这几种。python也不例外,也有这三种流程控制。下面的一一学习。顺序顺序语句很简单,从上往下依次顺序执行。如:a = 1b = 2print(a+b)上面的语句就是顺序执行的语句。选择选择通常使用if和switch,但python中只有if这一个选择语句。语法是:if 满足条件1: 语句1elif 不满足条件1满足1条件2 语句2else 都不满足 语句3比如用一个实际的例子a = 1b = 2if a > b: print(‘a>b’)el

nginx日志分析以及常用的命令

获得访问前10位的ip地址 cat access.log|gawk ‘{print $1}’ |sort|uniq -c|sort -nr |head -10访问次数最多的文件或页面 cat access.log|gawk ‘{print $11}’|sort|uniq -c|sort -nr通过子域名访问次数,依据referer来计算,稍有不准 cat access.log | awk ‘{print $11}’ | sed -e ‘ s/http:\/\///’ -e ‘ s/\/.*//’ | sort | uniq -c | sort -rn | head -20列出传输大小最大的几个

让wordpress更加中国化,去掉emoji,去掉google字体

wordpress水土不服的厉害,不得不去掉一些东西啦1.去掉emoji东西是好,但是中国没法用,只好忍痛去掉啦 remove_action( ‘admin_print_scripts’, ‘print_emoji_detection_script’);remove_action( ‘admin_print_styles’, ‘print_emoji_styles’);remove_action( ‘wp_head’, ‘print_emoji_detection_script’, 7);remove_action( ‘wp_print_styles’, ‘print_emoji_styles

Shell中的条件判断语句if的用法

shell中的if语法是最让我头疼的语法之一,它的判断就向使用USB插头一样——拿起来插入不行,翻转再插入还不行,再翻转插入行了!为了搞清楚这部分语言,我收集了一些文章关于if条件判断的用法,希望对你也有些帮助。一、基本语法if [ command ]; then 符合该条件执行的语句fiif [ command ];then 符合该条件执行的语句elif [ command ];then 符合该条件执行的语句else 符合该条件执行的语句fi语法说明bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语

utf8中文截断原理以及php的实现

php截断字符串用的是substr,但是这个是无法截断中文的,原因就是中文是采用多字节编码。这里说一下针对utf8编码的汉字截断原理。

UTF-8的编码规则是这样的

1)对于单字节的符号,字节的第一位(字节的最高位)设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

UTF-8编码方式(十六进制) | 十进制|(二进制)
—————+———————————————————————
0000 0000-0000 007F |0 – 127      | 0xxxxxxx
0000 0080-0000 07FF |192 – 223  |110xxxxx 10xxxxxx
0000 0800-0000 FFFF |224 – 239  |1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF |240 – 247  |11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

更详细的可以去看看utf8编码原理 (更多…)

你可能还喜欢下面这些文章

Shell中的条件判断语句if的用法

shell中的if语法是最让我头疼的语法之一,它的判断就向使用USB插头一样——拿起来插入不行,翻转再插入还不行,再翻转插入行了!为了搞清楚这部分语言,我收集了一些文章关于if条件判断的用法,希望对你也有些帮助。一、基本语法if [ command ]; then 符合该条件执行的语句fiif [ command ];then 符合该条件执行的语句elif [ command ];then 符合该条件执行的语句else 符合该条件执行的语句fi语法说明bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语