图片 1

多线程查询的例子,php数组的索引的学习笔记

存储在数组中的值被称为数组元素,每个数组元素有一个相关的引索(也称为关键字),可以用来访问元素。PHP允许间隔性的使用数字或字符串作为数组的引索。使用字符串作为引索更具有意义和便于使用。

PHP自身没有多线程的,可以借助扩展实现。但是curl_multi*
函数实现了多线程访问网站数据的功能。
步骤总结如下:

本篇文章主要介绍了Python守护进程和脚本单例运行,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

数字索引数组

第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

一、简介

创建一个数组可以使用如下代码:

 

守护进程最重要的特性是后台运行;它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等;它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行。

$num = array(1, 2, 3, 4, 5, 6);
 
以上代码会创建一个名为 $num 的数组,包含数字从1~6,array()
是一个语言结构,而不是函数。
如果需要按照升序排列数字保存在一个数组中,可以使用
range()函数自动创建这个数组。

 代码如下

Python有时需要保证只运行一个脚本实例,以避免数据的冲突。

$num1 = range(1, 10);
 
这行代码将创建一个1~10的数字数组。range()函数也可以对字符进行操作。
要访问一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。使用
$num[0] ,就可以使用数组 $num
中的数据了。在PHP中,数字索引的默认值是从0开始的。

<?php
$t=getTime();
$total=10;
for($i=0;$i<$total;$i++){
 $url_arr[] = ” /test”;
}
   
$mh = curl_multi_init();
foreach ($url_arr as $i =>
$url) {
 $conn[$i] = curl_init($url);
 curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
// 设置返回页面输出内容
 curl_multi_add_handle ($mh,$conn[$i]); // 添加线程
}
#—————-执行线程—————-
do {
 $mrc = curl_multi_exec($mh,$active);
}while ($mrc == CURLM_CALL_MULTI_PERFORM);

二、Python守护进程

$num[0] = 1;
 
数字数组使用有序的数字作为引索,可以使用 for 循环来显示数组的内容:

while ($active and $mrc == CURLM_OK) {
 if (curl_multi_select($mh)
!= -1) {
  do {
   $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 }
}

1、函数实现

for ($i = 0; $i<6; i++) {
  echo $num[$i];
}
 
非数字索引数组

foreach ($url_arr as $i => $url) {
 $res[$i]=curl_multi_getcontent($conn[$i]);//得到页面输入内容
 curl_multi_remove_handle($mh, $conn[$i]);
 curl_close($conn[$i]);
}
curl_multi_close($mh);

 

在PHP中,数组不需要预先初始化或者创建。

foreach($res as $k=>$v){
 $k=str_pad($k,2,0);
 echo “$k => $v <br>”;
}

 代码如下

$products[0] = rice;
$products[1] = milk;
 
这样就建立了一个数组 $products ,第一行代码是创建一个只有 rice
元素的数组。
还可以使用 => 将每个变量值与关键字关联起来。

runTime($t);
#———– calculate time function————-
function getTime(){
 $TIME=explode(”
“,microtime());
 $TIME=$TIME[1].substr($TIME[0],1);
 return $TIME;
}
function runTime($t,$l=3){
 $dif=getTime()-$t;
 echo ‘ ‘.number_format($dif,$l);
}
?>

#!/usr/bin/env python

$prices = array(‘rice’ => 10, ‘milk’ => 20);
 
和之前一样,可以使用 $prices[‘rice’]
的方式访问数组,这也是日常使用中常见的方式。

#coding: utf-8

由于非数字索引数组的索引是关键字,所以可以使用
foreach 循环或 list() 和
each() 结构来进行循环访问。

importsys, os

foreach循环

  

foreach ($prices as $key => $value) {
  echo $key.”-“.$value.”<br />”;
}
 
each()结构

”’将当前进程fork为一个守护进程

while ($element = each($prices)) {
  echo $element[‘key’];
  echo “-“;
  echo $element[‘value’];
  echo “<br />”;
}
 
each() 这个函数将返回数组的当前元素,并将下一个元素作为当前元素。因为在
while 循环中调用 each()
函数,它将按顺序返回数组中每个元素,并且当它到达数组末尾时,循环操作终止。

  注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了

list()结构

  所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了

while(list($produce, $price) = each($pirces) {
  echo “$product – $”proce<br />”;
}
 

”’

  

defdaemonize (stdin=’/dev/null’, stdout=’/dev/null’,
stderr=’/dev/null’):

   #重定向标准文件描述符(默认情况下定向到/dev/null)

  try: 

    pid=os.fork() 

     #父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。

    ifpid >0:

      sys.exit(0) #父进程退出

  exceptOSError, e: 

    sys.stderr.write (“fork #1 failed: (%d) %s\n”%(e.errno,
e.strerror) )

    sys.exit(1)

  

   #从母体环境脱离

  os.chdir(“/”)#chdir确认进程不保持任何目录于使用状态,否则不能umount一个文件系统。也可以改变到对于守护程序运行重要的文件所在目录

  os.umask(0) #调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。

  os.setsid() #setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。

  

   #执行第二次fork

  try: 

    pid=os.fork() 

    ifpid >0:

      sys.exit(0) #第二个父进程退出

  exceptOSError, e: 

    sys.stderr.write (“fork #2 failed: (%d) %s\n”%(e.errno,
e.strerror) )

    sys.exit(1)

  

   #进程已经是守护进程了,重定向标准文件描述符

  

  forfinsys.stdout, sys.stderr: f.flush()

  si=open(stdin,’r’)

  so=open(stdout,’a+’)

  se=open(stderr,’a+’,0)

  os.dup2(si.fileno(),
sys.stdin.fileno()) #dup2函数原子化关闭和复制文件描述符

  os.dup2(so.fileno(), sys.stdout.fileno())

  os.dup2(se.fileno(), sys.stderr.fileno())

  

#示例函数:每秒打印一个数字和时间戳

defmain():

  importtime

  sys.stdout.write(‘Daemon started with pid %d\n’%os.getpid())

  sys.stdout.write(‘Daemon stdout output\n’)

  sys.stderr.write(‘Daemon stderr output\n’)

  c=0

  whileTrue:

    sys.stdout.write(‘%d: %s\n’%(c, time.ctime()))

    sys.stdout.flush()

    c=c+1

    time.sleep(1)

  

if__name__==”__main__”:

   daemonize(‘/dev/null’,’/tmp/daemon_stdout.log’,’/tmp/daemon_error.log’)

   main()

 

可以通过命令ps -ef | grep
daemon.py查看后台运行的继承,在/tmp/daemon_error.log会记录错误运行日志,在/tmp/daemon_stdout.log会记录标准输出日志。

图片 1

2、类实现

 

 代码如下

#!/usr/bin/env python

#coding: utf-8

  

#python模拟linux的守护进程

  

importsys, os, time, atexit, string

fromsignalimportSIGTERM

  

classDaemon:

 def__init__(self, pidfile, stdin=’/dev/null’, stdout=’/dev/null’,
stderr=’/dev/null’):

   #需要获取调试信息,改为stdin=’/dev/stdin’, stdout=’/dev/stdout’,
stderr=’/dev/stderr’,以root身份运行。

  self.stdin=stdin

  self.stdout=stdout

  self.stderr=stderr

  self.pidfile=pidfile

   

 def_daemonize(self):

  try:

   pid=os.fork() #第一次fork,生成子进程,脱离父进程

   ifpid >0:

    sys.exit(0)  #退出主进程

  exceptOSError, e:

   sys.stderr.write(‘fork #1 failed: %d (%s)\n’%(e.errno, e.strerror))

   sys.exit(1)

   

  os.chdir(“/”)  #修改工作目录

  os.setsid()   #设置新的会话连接

  os.umask(0)   #重新设置文件创建权限

   

  try:

   pid=os.fork()#第二次fork,禁止进程打开终端

   ifpid >0:

    sys.exit(0)

  exceptOSError, e:

   sys.stderr.write(‘fork #2 failed: %d (%s)\n’%(e.errno, e.strerror))

   sys.exit(1)

   

   #重定向文件描述符

  sys.stdout.flush()

  sys.stderr.flush()

  si=file(self.stdin,’r’)

  so=file(self.stdout,’a+’)

  se=file(self.stderr,’a+’,0)

  os.dup2(si.fileno(), sys.stdin.fileno())

  os.dup2(so.fileno(), sys.stdout.fileno())

  os.dup2(se.fileno(), sys.stderr.fileno())

   

   #注册退出函数,根据文件pid判断是否存在进程

  atexit.register(self.delpid)

  pid=str(os.getpid())

  file(self.pidfile,’w+’).write(‘%s\n’%pid)

   

 defdelpid(self):

  os.remove(self.pidfile)

  

 defstart(self):

   #检查pid文件是否存在以探测是否存在进程

  try:

   pf=file(self.pidfile,’r’)

   pid=int(pf.read().strip())

   pf.close()

  exceptIOError:

   pid=None

   

  ifpid:

   message=’pidfile %s already exist. Daemon already running!\n’

   sys.stderr.write(message%self.pidfile)

   sys.exit(1)

    

  #启动监控

  self._daemonize()

  self._run()

  

 defstop(self):

  #从pid文件中获取pid

  try:

   pf=file(self.pidfile,’r’)

   pid=int(pf.read().strip())

   pf.close()

  exceptIOError:

   pid=None

   

  ifnotpid: #重启不报错

   message=’pidfile %s does not exist. Daemon not running!\n’

   sys.stderr.write(message%self.pidfile)

   return

  

发表评论