php文件图片批量上传程序代码

 更新时间:2016年11月25日 16:19  点击:1480
今天看到一个站长写了一个文件批量插件了,也是利用php写了,个人感觉还非常的不错于是整理一下给各位同学参考一下有兴趣的可下载测试一下。

说明:
uploadx php批量上传组件遵循开源协议(GPL),任何个人、组织可自由对本程序进行使用、二次开发等权力。
由此也将声明本人不对您个人、组织使用本程序所带来的商业利益及损失有干涉及负责,但请保留版权信息。
也欢迎对uploadx提出保贵的建议及意见,不胜感激。
本程序使用PHP程序编写,能更高效的批量处理PHP开发中的文件上传,图片处理、批量添加图片水印等问题,在使用本程序前请详细阅读使用说明!

HTML表单页

 代码如下 复制代码

<form enctype="multipart/form-data" action="uploadx.php" method="post">  
    <input name="uploadx[]" type="file">  
    <input name="uploadx[]" type="file">  
    <input type="submit" value="上传">  
</form>  

uploadx.php处理页

require ('./classes/uploadx.class.php'); 
 
$uploadx = new uploadx; 
 
$uploadx->save = './temp'; 
$uploadx->name = 'auto'; 
$uploadx->mini = '200,200,mini'; 
$uploadx->mark = './images/logo.png,0,60'; 
print_r($uploadx->is()); 

参数说明:

$uploadx->save
上传文件的保存目录
$uploadx->name;
上传文件的命名方式
参数说明
auto=自动随机文件名,
null=原文件名(覆盖),
其他自定义如按时间:date('YmdHis'); 
$uploadx->mini;
生成缩略图参数
width = 生成缩略图宽度。
height = 生成缩略图高度。
mini = 生成缩略图文件后缀附加名
默认留空不生成缩略图; 
$uploadx->mark;
上传图片文件添加水印参数:
水印文件,水印位置,水印透明度

位置参数说明:
0 = 随机;
1 = 左上角;
2 = 顶部居中;
3 = 右上角;
4 = 左居中;
5 = 中部居中;
6 = 右居中;
7 = 左下角;
8 = 底部居中;
9 = 右下角;

$uploadx->is(true);
返回已上传文件的数组
is参数说明:
true = 返回所有上传文件
false = 过滤失败文件 
$uploadx->is(); 
返回数据数组格式说明:
name = 上传后已保存的文件名
mini = 生成缩略图的文件名
mark = 添加水印状态,1表示成功,否则失败
code = 错误代码:0表示上传成功
error = 错误信息:上传错误时提示的错误信息
其中生成缩略图和添加水印功能也可单独使用!

以上是对uploadx2.0 进行简单的介绍, 
也欢迎各位能在使用过程中进行改进补充

例子

 代码如下 复制代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>uploadx demo</title>
</head>

<body>
<form enctype="multipart/form-data" action="uploadx.php" method="post">
 <input name="uploadx[]" type="file"> <br />
 <input name="uploadx[]" type="file"> <br />
 <input name="uploadx[]" type="file"> <br />
 <input name="uploadx[]" type="file"> <br />
 <br />
 <input type="submit" value="上传所选文件">
</form>
</body>
</html>

<?php

require ('./classes/uploadx.class.php');

$uploadx = new uploadx;

$uploadx->save = './temp';
$uploadx->name = 'auto';
$uploadx->mini = '200,200,mini';
$uploadx->mark = './images/logo.png,0,60';
print_r($uploadx->mini('./temp/2.jpg'));


uploadx.class.php

<?php

class uploadx {
  var $form = 'uploadx';
  var $save = './';  
  var $size = '1024';
  var $type = 'gif,bmp,png,jpg,jpeg,swf,flv,mp3,wma,rar,zip,7z,doc,docx,ppt,pptx,xls,xlsx,txt,pdf';
  var $name = null;
  var $mini = null;
  var $mark = null;
  var $version = '2.0';

  public function is($type = true){
   foreach ($this->files() as $key => $val) {
    $file = $mini = null;
    $file = $this->saves($val['name'], $val['type'], $val['tmp_name'], $val['size'], $val['error']);
    $file['code'] || $file['path'] = rtrim($this->save,'/').'/'.$file['name'];
    $file['code'] || $file['mini'] = $this->mini($file['path']);  
    $file['code'] || $file['mark'] = $this->mark($file['path']);    
    $file['code'] && $file['error'] = $this->error($file['code']);
    $type ? $files[] = $file :  ($file['code'] || $files[] = $file);
   }
    return isset($files) ? $files : array();
  }
  private function files(){
   if(count($_FILES[$this->form])<1) return array();
   if(is_array($_FILES[$this->form]['name'])){
    for($i=0; $i<count($_FILES[$this->form]['name']); $i++) {
     if($_FILES[$this->form]['error'][$i]==4) continue;
     $files[] = array(
      'name'=>$_FILES[$this->form]['name'][$i],
      'type'=>$_FILES[$this->form]['type'][$i],
      'tmp_name'=>$_FILES[$this->form]['tmp_name'][$i],
      'error'=>$_FILES[$this->form]['error'][$i],
      'size'=>$_FILES[$this->form]['size'][$i]);
    } 
   }else{
     $files[] = $_FILES[$this->form];
   }
     return $files;
  }
  private function saves($name, $type, $temp, $size, $error){  
    if($error) return array('name'=>$name, 'code'=>$error);
    $prefix = strtolower(pathinfo($name, PATHINFO_EXTENSION));
    if(!in_array($prefix, explode(',', strtolower($this->type)))){
     return array('name'=>$name, 'code'=>'-1');
    }
    if($size/1024>$this->size){
     return array('name'=>$name, 'code'=>'-2');
    }
    if(!is_dir($this->save)){
     if(!mkdir($this->save, 0777, TRUE)){
     return array('name'=>$name, 'code'=>'-3');
     }     
    }
    $filename = $this->name ? ($this->name=='auto' ? uniqid() : $this->name) : trim(basename($name,$prefix),'.');
    $savefile = trim($this->save,'/').'/'. $filename.'.'.$prefix;
    if(!@move_uploaded_file($temp,$savefile)){
     return array('name'=>$name, 'code'=>'-4');
    }
     @chmod($savefile,0777); 
    return array('name'=>$filename.'.'.$prefix, 'code'=>0);
  }
  public function mini($file = null){
   if(!$file || !$this->mini) return false;
   if(!is_file($file)) return $this->error(-5,$file);
   list($width, $height, $extends) = explode(',', $this->mini);
   $types = array('gif','png','jpg','jpeg');
   $type = pathinfo($file, PATHINFO_EXTENSION);
   if(!in_array($type, $types)) return $this->error(-6);
   if(!is_file($file)) return $this->error(-5,$file);
   $mini = $extends ? basename($file, $type).$extends.'.'.$type : trim(basename($file),'.');
   $image = imagecreatefromstring(file_get_contents($file));
   $imagex = imagesx($image);
   $imagey = imagesy($image);
   $scale = $width / $imagex;
   if($width>$imagex){
    $mini_width = $imagex;
    $mini_height = $imagey;
   }else{
    $mini_width = $width;
    $mini_height = round($scale * $imagey);
   }
   if(function_exists('imagecreatetruecolor') && function_exists('imagecopyresampled')){
    $temp = imagecreatetruecolor($mini_width, $mini_height);
    imagecopyresampled($temp,$image,0,0,0,0,$mini_width, $mini_height, $imagex, $imagey);
   }else{
    $temp = imagecreate($mini_width, $mini_height);
    imagecopyresized($temp,$image,0,0,0,0,$mini_width, $mini_height, $imagex, $imagey);    
   }
    imagejpeg($temp, rtrim($this->save,'/').'/'.$mini, 100);
    imagedestroy($temp);
    imagedestroy($image);

   return is_file(rtrim($this->save,'/').'/'.$mini) ? $mini: false;
  }
  public function mark($file = null){
     if(!$file || !$this->mark) return false;     
     list($watermark, $position, $opacity) = explode(',', $this->mark);
     if(!is_file($file) || !is_file($watermark)) return $this->error(-5,'FILE='.$file.'||'.'Watermark='.$watermark);
   $type = pathinfo($file, PATHINFO_EXTENSION);
   $types = array('gif','png','jpg','jpeg');
   if(!in_array($type, $types)) return $this->error(-6,$file);
         $opacity = min($opacity,100);
   $file_data = imagecreatefromstring(file_get_contents($file));
         $file_width = imagesx($file_data);
         $file_height = imagesy($file_data);
         if (in_array(pathinfo($watermark, PATHINFO_EXTENSION), array('gif','png'))) {
          $mark_data = imagecreatefromstring(file_get_contents($watermark));
          $mark_width = imagesx($mark_data);
          $mark_height =  imagesy($mark_data);
          switch($position){
              case 1: $x = 5; $y = 5; break;
              case 2: $x = ($file_width - $mark_width)/2; $y = $mark_height; break;
              case 3: $x = ($file_width - $mark_width)-5; $y = $mark_height; break;
              case 4: $x = 5; $y = ($file_height - $mark_height) / 2; break;
              case 5: $x = ($file_width - $mark_width)/2; $y = ($file_height - $mark_height)/2; break;
              case 6: $x = ($file_width - $mark_width)-5; $y = ($file_height - $mark_height)/2; break;
              case 7: $x = 5; $y = ($file_height - $mark_height) - 5; break;
              case 8: $x = ($file_width - $mark_width)/2; $y = ($file_height - $mark_height)-5; break;
              case 9: $x = ($file_width - $mark_width)-5; $y = ($file_height - $mark_height)-5; break;
              default: $x = rand(0,($file_width - $mark_width)); $y = rand(0,($file_height - $mark_height));
          } 
     $temp = imagecreatetruecolor($mark_width, $mark_height); 
        imagecopy($temp, $file_data, 0, 0, $x, $y, $mark_width, $mark_height); 
        imagecopy($temp, $mark_data, 0, 0, 0, 0, $mark_width, $mark_height); 
        imagecopymerge($file_data, $temp, $x, $y, 0, 0, $mark_width, $mark_height, $opacity);          
           imagejpeg($file_data, $file, 100);
           imagedestroy($temp);
           imagedestroy($file_data);
           imagedestroy($mark_data);
           return true;
         }else{
           return $this->error(-6,$watermark);
         } www.111cn.net
  }
  private function error($code = 0, $extends = ''){
   if($code){
   switch ($code) {    
    case 6:  $error = '写入临时文件夹失败'; break;
    case 5:  $error = '写入系统临时文件夹错误'; break;
    case 4:  $error = '没有文件被上传请检查表单'; break;
    case 3:  $error = '文件上传出错上传不完整'; break;
    case 2:  $error = '文件大小超出表单限制'; break;
    case 1:  $error = '文件大小超出系统限制'; break;
    case -1: $error = '上传文件类型不合法'; break;
    case -2: $error = '上传文件大小超出后台限制'; break;  
    case -3: $error = '创建文件保存路径失败'; break; 
    case -4: $error = '保存文件失败请检查路径'; break; 
    case -5: $error = '读取文件错误'; break; 
    case -6: $error = '不支持该操作'; break; 
    default: $error = '未知错误';
   }
    return  '['.$code.']:'.$error.$extends;
   }else{
    return false; 
   } 
  }

}

 

本文章给各位整理了三种php计划任务的例子,分别是利用了windows,linux及php的ignore_user_abort的函数来执行,下面我给大家分别举几个例子,有兴趣的朋友可进入参考。

WINDOWS中设置计划任务执行PHP文件

1、写一个PHP程序,命名为test.php,内容如下所示:

 代码如下 复制代码
<?
$fp = fopen("test.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!n");
fclose($fp);
?>

程序大胆地写,什么include/require尽管用,都没问题
2、新建Bat文件,命名为test.bat,内容如下所示:

D:phpphp.exe -q D:websitetest.php

3、建立WINDOWS计划任务:
开始–>控制面板–>任务计划–>添加任务计划
浏览文件夹选择上面的bat文件
设置时间和密码(登陆WINDOWS的)
保存即可了。
4、大功告成! 可以右键计划任务点“运行”试试

用PHP脚本实现定时任务

PHP脚本执行时间限制,默认的是30m 解决办法:set_time_limit();或者修改PHP.ini 设置max_execution_time时间(不推荐)
如果客户端浏览器关闭,程序可能就被迫终止,解决办法:ignore_user_abort即使关闭页面依然正常执行
如果程序一直执行很有可能会消耗大量的资源,解决办法使用sleep使用程序休眠一会,然后在执行
 
PHP定时执行的代码:

 代码如下 复制代码

<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(3000);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5;// 每隔5s运行
 
//方法1--死循环
do{
echo '测试'.time().'<br/>';
sleep($interval);// 等待5s
}while(true);
 
//方法2---sleep 定时执行
require_once './curlClass.php';//引入文件
 
$curl = new httpCurl();//实例化
$stime = $curl->getmicrotime();
for($i=0;$i<=10;$i++){
 
echo '测试'.time().'<br/>';
sleep($interval);// 等待5s
 
}
ob_flush();
flush();
$etime = $curl->getmicrotime();
echo '<hr>';
echo round(($etime-stime),4);//程序执行时间

Linux的Crontab执行PHP脚本

一、在Crontab中使用PHP执行脚本
就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。
每一小时执行myscript.php如下:

 代码如下 复制代码
 # crontab -e
00 * * * * /usr/local/bin/php /home/john/myscript.php

/usr/local/bin/php为PHP程序的路径。
二、在Crontab中使用URL执行脚本
如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。
下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。

 代码如下 复制代码
00 * * * * lynx -dump /myscript.php

 
下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用"curl -o"选项,你也可以把脚本的输出转储到临时文件。

 代码如下 复制代码

*/5 * * * * /usr/bin/curl -o temp.txt /myscript.php

 
下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。"-O temp.txt"表示输出会发送到临时文件。

 代码如下 复制代码
 */10 * * * * /usr/bin/wget -q -O temp.txt /myscript.php
发现一个前辈分析了PHP高并发高负载系统架构,觉得很全面很实用,收藏并分享,希望这个例子对各位朋友以后会有所帮助哦。

1.为什么要进行高并发与高负载的研究

2、高并发和高负载的约束条件

3、解决之道——硬件篇

4、解决之道——部署篇

5、解决之道——环境篇

6、解决之道——SiteEngine篇

7、解决之道——测试篇


1、为什么要进行高并发和高负载的研究

1.1、产品发展的需要

1.2、公司发展的需要

1.3、当前形式决定的

2、高并发和高负载的约束条件

2.1、硬件

2.2、部署

2.3、操作系统

2.4、Web 服务器

2.5、PHP

2.6、MySQL

2.7、测试

3、解决之道——硬件篇

处理能力的提升:部署多颗CPU,选择多核心、具备更高运算频率、更大高速缓存的CPU;

处理能力的提升最直接的反应在于Web请求的处理效率和PHP程序的执行效率。

内存带宽与容量:更大的内存带宽和容量;

内存带宽与容量的提升最直接的反应在于应对数据库大量的数据交换。

磁盘搜索与I/O能力:选择更高的转速、更大的硬盘缓存、组件磁盘阵列(RAID);

磁盘搜索与I/O能力的提升最直接反应在于数据库大量的查询和读写以及文件的读写。

网络带宽的提升可考虑的因素包括: 更大带宽、多线路接入、独享带宽;

服务器在大负载的情况下,对网络带宽的占用是十分可观的。

策略:硬件设施是应对大负载的基础,硬件设施的投入可根据实际压力和预算量力而行。

4、解决之道——部署篇

4.1、服务器分离

4.2、数据库集群和库表散列

4.3、镜像

4.4、负载均衡

分类:

 1)、DNS轮循

2)代理服务器负载均衡 

3)地址转换网关负载均衡 

4)NAT负载均衡 

5)反向代理负载均衡 

6)混合型负载均衡

策略:根据硬件投入和业务需求,选择合理的部署方案。

部署方案1:

适用范围:静态内容为主体的网站和应用系统;对系统安全要求较高的网站和应用系统。

Main Server:主服务器

承载程序的主体运行压力,处理网站或应用系统中的动态请求;

将静态页面推送至多个发布服务器;

将附件文件推送至文件服务器;

安全要求较高,以静态为主的网站,可将服务器置于内网屏蔽外网的访问。

DB Server:数据库服务器

承载数据库读写压力;

只与主服务器进行数据量交换,屏蔽外网访问。

File/Video Server:文件/视频服务器

承载系统中占用系统资源和带宽资源较大的数据流;

作为大附件的存储和读写仓库;

作为视频服务器将具备视频自动处理能力。

发布服务器组:

只负责静态页面的发布,承载绝大多数的Web请求;

通过Nginx进行负载均衡部署。

部署方案2:

适用范围:以动态交互内容为主体的网站或应用系统;负载压力较大,且预算比较充足的网站或应用系统;

Web服务器组:

Web服务无主从关系,属平行冗余设计;

通过前端负载均衡设备或Nginx反向代理实现负载均衡;

划分专用文件服务器/视频服务器有效分离轻/重总线;

每台Web服务器可通过DEC可实现连接所有数据库,同时划分主从。

数据库服务器组:

相对均衡的承载数据库读写压力;

通过数据库物理文件的映射实现多数据库的数据同步。

共享磁盘/磁盘阵列

将用于数据物理文件的统一读写

用于大型附件的存储仓库

通过自身物理磁盘的均衡和冗余,确保整体系统的IO效率和数据安全;

方案特性:

通过前端负载均衡,合理分配Web压力;

通过文件/视频服务器与常规Web服务器的分离,合理分配轻重数据流;

通过数据库服务器组,合理分配数据库IO压力;

每台Web服务器通常只连接一台数据库服务器,通过DEC的心跳检测,可在极短时间内自动切换至冗余数据库服务器;

磁盘阵列的引入,大幅提升系统IO效率的同时,极大增强了数据安全性。

5、解决之道——环境篇

5.1、操作系统

操作系统的选择,关注点在于

•是否适应于搭建SiteEngine所需要的环境程序?
•系统本身占用的资源比;
•系统安全性;
•系统是否易于操作?
策略:我们选择FreeBSD,而且是最小化安装以后的FreeBSD。

5.2、Web服务器

Web服务器很大一部分资源占用来自于处理Web请求,通常情况下这也就是Apache产生的压力,Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。

在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx (“engine x”) 是俄罗斯人编写的一款高性能的 HTTP 和反向代理服务器。在国内,已经有新浪、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。

Nginx的优势:

高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。

内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。

策略:相对于老牌的Apache,我们选择Lighttpd和Nginx这些具有更小的资源占用率和更高的负载能力的web服务器。

5.3、Mysql

MySQL本身具备了很强的负载能力,MySQL优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解。大家都知道数据库工作就是大量的、短时的查询和读写,除了程序开发时需要注意建立索引、提高查询效率等软件开发技巧之外,从硬件设施的角度影响MySQL执行效率最主要来自于磁盘搜索、磁盘IO水平、CPU周期、内存带宽。

  根据服务器上的硬件和软件条件进行MySQl优化。MySQL优化的核心在于系统资源的分配,这不等于无限制的给MySQL分配更多的资源。在MySQL配置文件中我们介绍几个最值得关注的参数:

改变索引缓冲区长度(key_buffer)

改变表长(read_buffer_size)

设定打开表的数目的最大值(table_cache)

对缓长查询设定一个时间限制(long_query_time)

如果条件允许 ,一般MySQL服务器最好安装在Linux操作系统中,而不是安装在FreeBSD中。

策略: MySQL优化需要根据业务系统的数据库读写特性和服务器硬件配置,制定不同的优化方案,并且可以根据需要部署MySQL的主从结构。

5.4、PHP

1、加载尽可能少的模块;

2、如果是在windows平台下,尽可能使用IIS或者Nginx来替代我们平常用的Apache;

3、安装加速器(都是通过缓存php代码预编译的结果和数据库结果来提高php代码的执行速度)


eAccelerator

eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。

Apc

Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

memcache

memcache是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。主要机制是通过在内存里维护一个统一的巨大的hash表,Memcache能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等

Xcache

国人开发的缓存器,

策略: 为PHP安装加速器。

5.5、代理服务器(缓存服务器)

Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。

策略:安装Squid 反向代理服务器,能够大幅度提高服务器效率。

6、解决之道——SiteEngine篇

7、解决之道——测试篇

7.1、测试方法

7.2、测试用例

7.3、压力测试

压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。

压力测试工具:webbench,ApacheBench等

7.4、漏洞测试

在我们的系统中漏洞主要包括:sql注入漏洞,xss跨站脚本攻击等。安全方面还包括系统软件,如操作系统漏洞,mysql、apache等的漏洞,一般可以通过升级来解决。

漏洞测试工具:Acunetix Web Vulnerability Scanner

今天在利用curl_multi函数来获取一些外网内容时发现只要一运行curl_multi函数我的cpu就占得非常的高,后来看一站长分享了此问题解决方法我也整理一下与各位分享一下,希望对大家有帮助。

简单的cURL处理如下:

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.111cn.net');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$con = curl_exec($ch);
curl_close($ch);

cURL还提供了批量处理会话,下面是cURL批量处理相关函数:
curl_multi_init — 返回一个新cURL批处理句柄
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
curl_multi_exec — 解析一个cURL批处理句柄
curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_select — 等待所有cURL批处理中的活动连接
curl_multi_info_read — 获取当前解析的cURL的相关传输信息
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_close — 关闭一组cURL句柄

看下面使用curl multi批处理的例子:

 代码如下 复制代码
<?php
/**
 * cURL multi批量处理
 *
 * @author mckee
 * @link http://www.111cn.net
 *
 */
 
$url_array = array(
    'http://www.111cn.net/',
    'http://www.111cn.net/php/627.html',
    'http://www.111cn.net/php/258.html'
);
 
$handles = $contents = array();
 
//初始化curl multi对象
$mh = curl_multi_init();
 
//添加curl 批处理会话
foreach($url_array as $key => $url)
{
    $handles[$key] = curl_init($url);
    curl_setopt($handles[$key], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($handles[$key], CURLOPT_TIMEOUT, 10);
   
    curl_multi_add_handle($mh, $handles[$key]);
}
 
//======================执行批处理句柄=================================
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
 
while ($active and $mrc == CURLM_OK) {
   
    if(curl_multi_select($mh) === -1){
        usleep(100);
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
}
//====================================================================
 
//获取批处理内容
foreach($handles as $i => $ch)
{
    $content = curl_multi_getcontent($ch);
    $contents[$i] = curl_errno($ch) == 0 ? $content : '';
}
 
//移除批处理句柄
foreach($handles as $ch)
{
    curl_multi_remove_handle($mh, $ch);
}
 
//关闭批处理句柄
curl_multi_close($mh);
 
print_r($contents);

上面这段程序重点是执行批处理的那段,普通的处理:

 代码如下 复制代码
do { $n=curl_multi_exec($mh,$active); } while ($active);

会造成CPU Loading过高,因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,没有执行数据就会sleep,如此就会避免CPU Loading 100%了。

SAE域名绑定之后,一般是用CNAME方式将域名绑定到应用中。但是有时候我们需要用到A记录(比如说根域名,虽然在DNSPOD上可以设置CNAME记录,但很可能会影响到MX记录),而SAE的IP地址经常改变,ping应用二级域名得到的IP没多久就失效了(前些天网站因此几天打不开都没发现,我用的是教育网,自己能打开,但是电信线路变了)。还好DNSPOD有个功能叫D监控,可以帮你监控网站能否正常打开。如果发现宕机,DNSPOD会用邮件、短信、微信等方式提醒你。这里用到的是它的另一个通知方式,那就是URL回调

 “通过DNSPod 提供的D监控 URL 回调功能,您可以让宕机或恢复信息提交到您指定的 URL 上,从而更加灵活地处理各种通知信息。”

我们可以通过宕机之后的URL回调取得相关参数,并通过DNSPOD API实现自动修改记录的功能,再通过飞信发送宕机通知。

代码在后面,先说设置方法:

dnspod-monitor-callback

设置方法

1.点此下载代码,修改其中的参数为你自己的。

2.将代码上传到网站。

3.在DNSPOD开启D监控,在通知设置中回调URL一栏填入monitorCallback.php的地址,如http://blog.gimhoy.com/monitorCallback.php?rHost=hipic.sinaapp.com.其中rHost是SAE的二级域名。并设置回调密钥。

4.Enjoy~

dnspod-monitor-callback


代码
monitorCallback.php

 代码如下 复制代码

/*
* Copyright 2007-2014 Gimhoy Studio.
*
* @author Gimhoy
* @email contact@gimhoy.com
* @version 1.0.0
*/
$rHost = $_GET['rHost']; // SAE二级域名
if(empty($rHost)) $rHost = 'sinaapp.com';
$logName = 'monitorLog.txt'; //log 文件名
$logStorDomain = 'log'; // Storage Domain
$FetionNum = ''; //飞信登陆号码
$FetionPwd = ''; //飞信登陆密码
$MobileNum = ''; //接收通知短信的号码
$callback_key = 'MYKEY'; // 添加监控时设置的密钥

$monitor_id = $_POST['monitor_id']; // 监控编号
$domain_id = $_POST['domain_id']; // 域名编号
$domain = $_POST['domain']; // 域名名称
$record_id = $_POST['record_id']; // 记录编号
$sub_domain = $_POST['sub_domain']; // 主机名称
$record_line = $_POST['record_line']; // 记录线路
$ip = $_POST['ip']; // 记录IP
$status = $_POST['status']; // 当前状态
$status_code = $_POST['status_code']; // 状态代码
$reason = $_POST['reason']; // 宕机原因
$created_at = $_POST['created_at']; // 发生时间
$checksum = $_POST['checksum']; // 校检代码

if (md5($monitor_id. $domain_id. $record_id. $callback_key. $created_at) != $checksum) {
// 非法请求
echo 'BAD REQUEST';
} else {
// 开始处理
if ($status == 'Warn' || $status == 'Ok') {
// 宕机恢复
$msg = date("Y-m-d H:i:s").' '.$sub_domain.'.'.$domain."(".$record_line." ".$ip.")宕机恢复";
} elseif ($status == 'Down') {
// 宕机
$msg = date("Y-m-d H:i:s").' '.$sub_domain.'.'.$domain."(".$record_line." ".$ip.")在".$created_at."宕机。宕机原因:".$reason."可用IP:";
$ips = @gethostbyname($rHost);
include_once 'dnspod.class.php';
$newIP = $ips;
$data = array(
'domain_id' => $domain_id,
'record_id' => $record_id,
'sub_domain' => $sub_domain,
'record_type' => 'A',
'record_line' => $record_line,
'ttl' => '600',
'value' => $newIP
);
$dnspod = new dnspod();
$response = $dnspod->api_call('Record.Modify', $data);
if(isset($response['status']['code']) && $response['status']['code'] == 1) {
$msg = $msg.$newIP.'(已切换)';
}
else {
$msg = $msg.$newIP.'(切换失败,错误代码'.$response['status']['code'].')';
}
}
//飞信通知
require_once 'Fetion.class.php';
$fetion = new PHPFetion($FetionNum, $FetionPwd);
$result = $fetion->send($MobileNum, $msg);
if(strpos($result, '短信发送成功!') || strpos($result, '发送消息成功!')) { $r = "成功。";}else{$r = "失败。";}
$s = new SaeStorage();
$content = $s -> read($logStorDomain, $logName);
$content = $content.$msg.'。飞信通知'.$r.'
';
$s -> write($logStorDomain, $logName, $content);

// 处理完成
echo 'DONE';
}

dnspod.class.php

/*
* DNSPod API PHP Web 示例
* http://www.111cn.net/
*
* Copyright 2011, Kexian Li
* Released under the MIT, BSD, and GPL Licenses.
*
*/

class dnspod {
public function api_call($api, $data) {
if ($api == '' || !is_array($data)) {
exit('内部错误:参数错误');
}
$api = 'https://dnsapi.cn/' . $api;
$data = array_merge($data, array('login_email' => 'DNSPOD登陆账号', 'login_password' => 'DNSPOD登陆密码', 'format' => 'json', 'lang' => 'cn', 'error_on_empty' => 'yes'));

$result = $this->post_data($api, $data);

if (!$result) {
exit('内部错误:调用失败');
}
$results = @json_decode($result, 1);
if (!is_array($results)) {
exit('内部错误:返回错误');
}
if ($results['status']['code'] != 1) {
exit($results['status']['message']);
}
return $results;
}
private function post_data($url, $data) {
if ($url == '' || !is_array($data)) {
return false;
}
$ch = @curl_init();
if (!$ch) {
exit('内部错误:服务器不支持CURL');
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_USERAGENT, 'Gimhoy Monitor/1.0 (contact@gimhoy.com)');
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}


Fetion.class.php

 代码如下 复制代码

header('Content-Type: text/html; charset=utf-8');
/**
* PHP飞信发送类
* @author quanhengzhuang
* @version 1.5.0
*/
class PHPFetion {
/**
* 发送者手机号
* @var string
*/
protected $_mobile;
/**
* 飞信密码
* @param string
*/
protected $_password;
/**
* Cookie字符串
* @param string
*/
protected $_cookie = '';
/**
* Uid缓存
* @var array
*/
protected $_uids = array();
/**
* csrfToken
* @param string
*/
protected $_csrfToten = null;
/**
* 构造函数
* @param string $mobile 手机号(登录者)
* @param string $password 飞信密码
*/
public function __construct($mobile, $password)
{
if ($mobile === '' || $password === '')
{
return;
}
$this->_mobile = $mobile;
$this->_password = $password;
$this->_login();
}
/**
* 析构函数
*/
public function __destruct() {
$this->_logout();
}
/**
* 登录
* @return string
*/
protected function _login()
{
$uri = '/huc/user/space/login.do?m=submit&fr=space';
$data = 'mobilenum='.$this->_mobile.'&password='.urlencode($this->_password);
$result = $this->_postWithCookie($uri, $data);

//解析Cookie
preg_match_all('/.*?rnSet-Cookie: (.*?);.*?/si', $result, $matches);
if (isset($matches[1]))
{
$this->_cookie = implode('; ', $matches[1]);
}
$result = $this->_postWithCookie('/im/login/cklogin.action', '');

return $result;
}
/**
* 获取csrfToken,给好友发飞信时需要这个字段
* @param string $uid 飞信ID
* @return string
*/
protected function _getCsrfToken($uid)
{
if ($this->_csrfToten === null)
{
$uri = '/im/chat/toinputMsg.action?touserid='.$uid;
$result = $this->_postWithCookie($uri, '');
preg_match('/name="csrfToken".*?value="(.*?)"/', $result, $matches);

$this->_csrfToten = isset($matches[1]) ? $matches[1] : '';
}

return $this->_csrfToten;
}

/**
* 向指定的手机号发送飞信
* @param string $mobile 手机号(接收者)
* @param string $message 短信内容
* @return string
*/
public function send($mobile, $message) {
if($message === '') {
return '';
}
// 判断是给自己发还是给好友发
if($mobile === $this->_mobile) {
return $this->_toMyself($message);
}
else if(strlen($mobile)===11){
$uid = $this->_getUid($mobile);
}
else {
$uid=$mobile;
}
return $uid === '' ? $this->_addFriend($mobile) : $this->_toUid($uid, $message);
}
protected function _getname() {
$uri = '/im/index/index.action';
$result = $this->_postWithCookie($uri, '#');
// 匹配
preg_match('/(.*?)</a>/si', $result, $matches);
return $matches[2];
}
/*
* 通过手机号增加好友
* @param string $number 手机号(要加的好友手机)
* @param string $nickname 你的名字,出现在对方的验证短信里
* @param string $buddylist 分组,默认为空
* @param string $localName 好友屏显名
* @return string
*/
protected function _addFriend($number) {
$uri = '/im/user/insertfriendsubmit.action';
$data = 'nickname='. urlencode($this->_getname()).'&buddylist=1&localName=&number='. $number .'&type=0';
$result = $this->_postWithCookie($uri, $data);
return $result;
}
/**
* 获取飞信ID
* @param string $mobile 手机号
* @return string
*/
protected function _getUid($mobile)
{
if (empty($this->_uids[$mobile]))
{
$uri = '/im/index/searchOtherInfoList.action';
$data = 'searchText='.$mobile;
$result = $this->_postWithCookie($uri, $data);
//匹配
preg_match('/toinputMsg.action?touserid=(d+)/si', $result, $matches);

$this->_uids[$mobile] = isset($matches[1]) ? $matches[1] : '';
}
return $this->_uids[$mobile];
}
/**
* 向好友发送飞信
* @param string $uid 飞信ID
* @param string $message 短信内容
* @return string
*/
protected function _toUid($uid, $message) {
$uri = '/im/chat/sendMsg.action?touserid='.$uid;
$csrfToken = $this->_getCsrfToken($uid);
$data = 'msg='.urlencode($message).'&csrfToken='.$csrfToken;
$result = $this->_postWithCookie($uri, $data);
return $result;
}
/**
* 给自己发飞信
* @param string $message
* @return string
*/
protected function _toMyself($message) {
$uri = '/im/user/sendMsgToMyselfs.action';
$result = $this->_postWithCookie($uri, 'msg='.urlencode($message));
return $result;
}
/**
* 退出飞信
* @return string
*/
protected function _logout() {
$uri = '/im/index/logoutsubmit.action';
$result = $this->_postWithCookie($uri, '');
return $result;
}
protected function getgroup() {
$uri = '/im/index/index.action';
$data = 'type=group';
$result = $this->_postWithCookie($uri, $data);
// 匹配
preg_match_all('/contactlistView.action?idContactList=(d+)/si', $result, $matches);
foreach($matches[1] as $k=>$v){
if( $k== 0 ){
$min = $v;
$max = $v;
}else if($v!=9998&&$v!=9999){
$min = min($min,$v);
$max = max($max,$v);
}
}
return $max;
}
public function getyou1() {
$list=$this->getgroup();
for($i=0;$i<=$list;$i++){
$uri = '/im/index/contactlistView.action';
$data = 'idContactList='.$i.'&type=group';
$result = $this->_postWithCookie($uri, $data);
preg_match('/(.*?)|(.*?)((.*?)/(.*?))/si', $result, $listn);
if(!$listn[2]){continue;}
$shuchu.=str_replace(" ","",$listn[2])."(".$listn[4].")n";
preg_match('/共(d+)页/si', $result, $zpage);
preg_match('/共(d+)</a>页/si', $result, $dpage);
isset($zpage[1]) ? $page=$zpage[1] : $page=$dpage[4];
for($j=1;$j<=$page;$j++){
$uri = '/im/index/contactlistView.action';
$data = 'idContactList='.$i.'&page='.$j;
$result = $this->_postWithCookie($uri, $data);
preg_match_all('/(.*?)</a>/si', $result, $matches);
if(!$matches[1][0]){break;}
for($x=0;$x<=9;$x++){
if(!$matches[1][$x]){continue;}
$shuchu.=$matches[1][$x]." ".str_replace(" ","",$matches[3][$x])."n";
}
}
}
return $shuchu;
}
public function getyou() {
$list=$this->getgroup();
for($i=0;$i<=$list;$i++){
$uri = '/im/index/contactlistView.action';
$data = 'idContactList='.$i.'&type=group';
$result = $this->_postWithCookie($uri, $data);
preg_match('/(.*?)|(.*?)((.*?)/(.*?))/si', $result, $listn);
if(!$listn[2]){continue;}
$shuchu.=str_replace(" ","",$listn[2])."(".$listn[4].")n";
preg_match('/共(d+)页/si', $result, $zpage);
preg_match('/共(d+)</a>页/si', $result, $dpage);
isset($zpage[1]) ? $page=$zpage[1] : $page=$dpage[4];
for($j=1;$j<=$page;$j++){
$uri = '/im/index/contactlistView.action';
$data = 'idContactList='.$i.'&page='.$j;
$result = $this->_postWithCookie($uri, $data);
preg_match_all('/(.*?)</a>/si', $result, $matches);
if(!$matches[1][0]){break;}
for($x=0;$x<=9;$x++){
if(!$matches[1][$x]){continue;}
$shuchu.=$matches[1][$x]." ".str_replace(" ","",$matches[3][$x])."n";
}
}
}
return $shuchu;
}
/**
* 携带Cookie向f.10086.cn发送POST请求
* @param string $uri
* @param string $data
*/
protected function _postWithCookie($uri, $data)
{
$fp = fsockopen('f.10086.cn', 80);
fputs($fp, "POST $uri HTTP/1.1rn");
fputs($fp, "Host: f.10086.cnrn");
fputs($fp, "Cookie: {$this->_cookie}rn");
fputs($fp, "Content-Type: application/x-www-form-urlencodedrn");
fputs($fp, "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1rn");
fputs($fp, "Content-Length: ".strlen($data)."rn");
fputs($fp, "Connection: closernrn");
fputs($fp, $data);

$result = '';
while (!feof($fp))
{
$result .= fgets($fp);
}

fclose($fp);

return $result;
}
}

 

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Photoshop古装美女图片转为工笔画效果制作教程

    今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮

    jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • Photoshop枪战电影海报图片制作教程

    Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14