竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


272月/170

PHP命名空间namespace/类别名 use/框架自动载入 机理

发布在 邵珠庆

摘要: PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性

命名空间 

延迟静态绑定 

lambda匿名函数

命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MVC 框架也随之出现,明了的项目结构的同时也按需载入,进一步减轻内存压力,加快执行效率。

因为命名空间是对目录结构友好的

namespace Home\Controller; 
class IndexController { }

而 PHP5.2 之前是按造类的下划线去做类似 命名空间 的定义的

class Home_Controller_IndexController  { }

一、 命名空间 及 USE 的本质

php 的 use 关键字并不是立刻导入所use的类,它只是声明某类的完整类名(命名空间::类标示符),而后你在上下文中使用此类时系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入

 
namespace Home\Controller; 
use Home\Model\User; 
use Home\Model\Order as OrderList; 
class IndexController {     
public function index() {         
//只有当你调用此类时,系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入         
$user = new User();         
$order = new OrderList();     
} 
}
就像如下的代码 自动载入函数是在 use 两个类之后方才实现的 因为 use 并不会立即使用此类 只有在你调用此类时系统才会在找不到此类的情况下通过 autoload 函数动态延迟加载,若仍加载不到,则报错
 

1、某命名空间下的类 的完整名称为 namespace\className,当在某命名空间上下文中访问其它命名空间下的类时,我们可以使用 use 做别名化,或者使用此类的完整名称,但要以 '\' 根命名空间开头,否则解释器会认为你是在当前命名空间上下文中调用,即 foo\bar 方式会以 currentNamespace\foo\bar的方式去加载

命名空间与linux文件系统很相似,'\' 代表根,不以根开始的皆认为以当前命名空间为基点

2、use 只是给你使用的类定义短别名,use foo\bar 后则new bar() 即new  \foo\bar(),还有个小技巧,当我们同时引用不同命名空间下的类名相同的类时可以使用 as 为其定义一个新别名

use foo\bar\sameName as classA; 
use bar\foo\sameName as classB; 
new classA(); // new \foo\bar\sameName; 
new classB(); // new \bar\foo\sameName;

3、当我们通过 入口文件 加载参数配置 实例化一个应用主体 加载路由组件解析请求 分派控制器调用方法时,期间会调用其他的类,比如 

use yii\web\Controller;

系统便会去通过自动载入函数做最一次载入尝试,若仍加载不到此类则报错

下面我们看下 Yii2 从入口文件开始一个应用实体后注册自动载入函数的流程

index.php

入口文件载入配置和系统框架时会使用require调用,因为现在还没有注册自动加载函数

载入 Yii bootstrap 文件时便通过 spl_autoload_register 注册了自动载入函数 

Yii.php

Yii2的自动载入函数

继承至 BaseYii 它要做的就是根据你命名空间类型的类名去映射为此类所在的文件路径

比如 yii\web\Controller类会根据 yii 而映射到  YII2_PATH . '/web/Controller.php' 文件中,而这个文件则是命名空间为 yii\web 的 Controller 类,将此文件载入即可访问 yii\web\Controller 类

而我们自己编写的控制器或者模型则访问时为 'app\controllers\IndexController' 'app\models\EntryForm'

则 autoload 函数会根据 app 为 映射关键字将其定位到 controllers 或 models 文件夹下从而读取对应的文件即可载入相应的类,这也是为什么 类名 与 文件名 相互对应的原因所在,若不存在对应,则你只能通过固定的 require 某个文件去加载你写在其中的类了 

扩展自己的类库

我们可以通过Yii2的自动载入机制灵活的归类我们自己写的工具类等,比如我想创建一个自己的组件库

你可以定义一个  yii\tools 命名空间的类文件 MyTools.php,比如

 

放入 vendor\yiisoft\yii2\tools 文件夹下,

通过

<?php

namespace app\controllers;

// yii一级命名空间 则 映射到 YII_PATH 下
// 根据 tools\MyTools 定位到 YII_PATH 下的 tools文件夹下的 MyTools.php
use yii\tools\MyTools;
use yii\web\Controller;

class MyController extends Controller {
}
?>

当然你也可以在你的项目目录下新建一个 tools 文件夹 把 MyTools.php 放进去,将里面的命名空间改为 app\tools 即可,系统会根据 app 映射到项目根目录 通过 tools\MyTools 把 tools文件夹下的 MyTools.php文件载入 即载入了 MyTools 类

三、剖析TP的自动载入

thinkphp的自动加载规则也一样,只不过 tp autoload函数并没有像 Yii2 basic 版预先定义一个项目根目录的映射规则,  Yii2则是以 app 顶级命名空间为默认的应用命名空间,yii顶级命名空间作为框架命名空间,所以你只要把自己的类归属到项目根目录(app下)或 YII_PATH(框架路径) 下,然后放对文件路径即可,

tp的话有的你自己想tp可以在 APP_PATH 下放多个  module ,像其预先定义的 Home ,或者你可以 BIND_MODULE来帮定义一个自己的模块,这样在通过入口文件载入的应用实体做路由时便能判断你请求的是哪个模块下的控制器和方法

tp有几个系统占用的顶级命名空间

Think Org Behavior Com Vendor

而你自己的则会以 APP_PATH 为根目录进行加载,比如 Home\Controller\IndexController.class.php,当你访问 Index 时路由解析出来的类为 Home\Controller\IndexController,自动载入函数则根据 Home 非系统命名空间而定位到你的APP_PATH下进行加载,所以TP也可以自己定义的  AUTOLOAD_NAMESAPCE做自定义扩展

'AUTOLOAD_NAMESAPCE' => [     'Tools' => APP_PATH . 'Vendor\Tools' ]

这样便把 Tools 顶级命名空间注册到了自动载入函数中,当我们

use Tools\Extension\MyTools 时

传入 autoload 的 $class 即为 Tools\Extension\MyTools,得到的 $name 其实为一级命名空间名 这里为 Tools,Tools 不符合第一条件,在 else 中读取自定义的  AUTOLOAD_NAMESAPCE,发现我们有设置 键名为 Tools 的成员

便使用 dirname(键值)得到 APP_PATH . 'Vendor',我是觉得这里 dirname 写的有些鸡肋....所以便成功的映射定位出 Tools一级命名空间所在的文件目录为 APP_PATH . 'Vendor' 下,在与完整的类名 Tools\Extension\MyTools 拼接上 EXT即可定位到类文件,加载即可。

171月/170

PHP生成随机红包高级方法

发布在 邵珠庆

/** 传输数字必须为正整数,需要小数通过$bonus_float传值进行换算
* @param $bonus_total (必填) 红包总额
* @param $bonus_count (必填) 红包个数
* @param $bonus_max   (选填) 每个小红包的最大额 最大值要大于平均值
* @param $bonus_min   (选填) 每个小红包的最小额
* @param $bonus_float (选填 Y元J角F分) 红包传入单位
* @return 存放生成的每个小红包的值的一维数组
*/
function getBonus($bonus_total, $bonus_count=20, $bonus_max=0, $bonus_min=1, $bonus_float='Y') {
    $total_money  = 0;
    $arr1         = array();
    $arr2         = array();
    $res          = array();
    // 转换传入金额单位 Y元 J角 F分
    $tmp_float    = $bonus_float;
    if($bonus_float=='Y'){ $bonus_float = 1;   $num_fmt  = 0;}
    if($bonus_float=='J'){ $bonus_float = 10;  $num_fmt  = 1;}
    if($bonus_float=='F'){ $bonus_float = 100; $num_fmt  = 2;}
    // 每人红包平均值
    $average = $bonus_total / $bonus_count;
    // 防止传入参数越界
    if($average > $bonus_max){ echo $bonus_max = round(($bonus_total-$average)/$bonus_count,0)+round($average,0);   }
    if($average < $bonus_min){ echo $bonus_min = 1; }
    $range1  = ($average - $bonus_min)*($average - $bonus_min);
    $range2  = ($bonus_max - $average)*($bonus_max - $average);
    // 生成随机红包逻辑
    for ( $i = 0; $i < $bonus_count; $i++) {         if (rand($bonus_min, $bonus_max) > $average) {
            $temp         = $bonus_min + intval(sqrt(rand(0, (intval($range1)-1))));
            $arr1[$i]   = $temp;
            $bonus_total -= $temp;
        } else {
            $temp         = $bonus_max - intval(sqrt(rand(0, (intval($range2)-1))));
            $arr1[$i]   = $temp;
            $bonus_total -= $temp;
        }
    }
    while ($bonus_total > 0) {
        for ($i = 0; $i < $bonus_count; $i++) {             if ($bonus_total > 0 && $arr1[$i] < $bonus_max) {
                $arr1[$i]++;
                $bonus_total--;
            }
        }
    }
    while ($bonus_total < 0) {
        for ($i = 0; $i < $bonus_count; $i++) {
            if ($bonus_total < 0 && $arr1[$i] > $bonus_min) {
                $arr1[$i]--;
                $bonus_total++;
            }
        }
    }
    // 输出格式化数据结果
    for ($i = 0; $i < $bonus_count; $i++) {
        $arr1[$i]     = number_format($arr1[$i]/$bonus_float,$num_fmt,'.','');
        //统计每个钱数的红包数量,检查是否接近正态分布
        $total_money += $arr1[$i];
        if(isset($arr2[$arr1[$i]])){  $arr2[$arr1[$i]] += 1; }else{ $arr2[$arr1[$i]]  = 1; }
    }
    ksort($arr2);

    $res["total"] = $total_money."(Y)";
    $res["bnmax"] = $bonus_max."(".$tmp_float.")";
    $res["bnmin"] = $bonus_min."(".$tmp_float.")";
    $res["money"] = $arr1;
    $res["count"] = $arr2;

    return $res;
}

$bonus_total  = 2000;
$bonus_count  = 30;
$bonus_max    = 90;  //最大值要大于平均值
$bonus_min    = 1;
$bonus_float  = "Y"; //
$result_bonus = getBonus($bonus_total, $bonus_count,$bonus_max);

echo "

";
print_r($result_bonus);
 
Array
(
    [total] => 2000(Y)
    [bnmax] => 90(Y)
    [bnmin] => 1(Y)
    [money] => Array
        (
            [0] => 74
            [1] => 24
            [2] => 67
            [3] => 73
            [4] => 67
            [5] => 47
            [6] => 69
            [7] => 75
            [8] => 63
            [9] => 44
            [10] => 77
            [11] => 76
            [12] => 70
            [13] => 76
            [14] => 76
            [15] => 72
            [16] => 73
            [17] => 85
            [18] => 68
            [19] => 72
            [20] => 76
            [21] => 68
            [22] => 55
            [23] => 67
            [24] => 65
            [25] => 75
            [26] => 70
            [27] => 71
            [28] => 65
            [29] => 40
        )

    [count] => Array
        (
            [24] => 1
            [40] => 1
            [44] => 1
            [47] => 1
            [55] => 1
            [63] => 1
            [65] => 2
            [67] => 3
            [68] => 2
            [69] => 1
            [70] => 2
            [71] => 1
            [72] => 2
            [73] => 2
            [74] => 1
            [75] => 2
            [76] => 4
            [77] => 1
            [85] => 1
        )

)
38月/160

PHP下SSL加密解密、验证、签名方法(很简单)

发布在 邵珠庆

RSA超级简单,依赖于OpenSSL扩展,这里就不多废话了,直接奉上代码

 

签名:
function sign($data) {
//读取私钥文件(签名一定是商户自己本地生成的私钥)
$priKey = file_get_contents('key/rsa_private_key.pem');

//转换为openssl密钥,必须是没有经过pkcs8转换的私钥(不要使用这个私钥rsa_private_key_pkcs8.pem)

$res = openssl_get_privatekey($priKey);

//调用openssl内置签名方法,生成签名$sign
openssl_sign($data, $sign, $res);

//释放资源
openssl_free_key($res);

return $sign;
}
验证:
function verify($data, $sign) {
//读取支付宝公钥文件(一定是阿里后台生成提供的公钥)
$pubKey = file_get_contents('key/alipay_public_key.pem');

//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);

//调用openssl内置方法验签,返回bool值
$result = (bool)openssl_verify($data, $sign, $res);

//释放资源
openssl_free_key($res);

return $result;

解密
function decrypt($content) {

//读取商户私钥(商户自己生成的私钥)
$priKey = file_get_contents('key/rsa_private_key.pem');

//转换为openssl密钥,必须是没有经过pkcs8转换的私钥
$res = openssl_get_privatekey($priKey);

//声明明文字符串变量
$result = '';

//循环按照128位解密
for($i = 0; $i < strlen($content)/128; $i++ ) {
$data = substr($content, $i * 128, 128);

//拆分开长度为128的字符串片段通过私钥进行解密,返回$decrypt解析后的明文
openssl_private_decrypt($data, $decrypt, $res);

//明文片段拼接
$result .= $decrypt;
}

//释放资源
openssl_free_key($res);

//返回明文
return $result;
}

 

AES密钥是什么

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是目前对称密钥加密中比较通用的一种加密方式。

AES密钥有什么用

支付宝开放平台所有OpenAPI均支持对接口的请求内容和响应内容进行AES加密,部分OpenAPI(芝麻信用等)强制要求AES加密。加密后,在网络上传输的接口报文内容将会由明文内容变为密文内容,可以大大提升接口内容传输的安全性。

AES密钥与RSA密钥的关系

  • AES密钥是对接口请求和响应内容进行加密,密文无法被第三方识别,从而防止接口传输数据泄露。
  • RSA密钥是对接口请求和响应内容进行签名,开发者和支付宝开放平台分别加签验签,以确认接口传输的内容没有被篡改。不论接口内容是明文还是密文,RSA均可正常签名。
  • 开发者可对请求参数先做AES加密,然后对密文进行RSA签名。
264月/160

file_get_contents(“php://input”)的使用方法

发布在 邵珠庆

$data = file_get_contents("php://input");

    php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。 

    

 

1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据 时,http request entity body部分都为空。 

2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。

学习笔记

 1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST 

 2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA 

 3, 只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。 

 4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。 

 5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini 

 6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。

 

例子

 1.php用file_get_contents("php://input")或者$HTTP_RAW_POST_DATA可以接收xml数据

 比如:

  getXML.php;//接收XML地址

  

<?php 

     $xmldata = file_get_contents("php://input"); 

     $data = (array)simplexml_load_string($xmldata); 

?> 

 

  这里的$data就是包含xml数据的数组,具体php解析xml数据更新详细的方法

  sendXML.php

 

<?php 

     $xml = '<xml>xmldata</xml>';//要发送的xml 

     $url = 'http://localhost/test/getXML.php';//接收XML地址 

 

     $header = 'Content-type: text/xml';//定义content-type为xml 

     $ch = curl_init(); //初始化curl 

     curl_setopt($ch, CURLOPT_URL, $url);//设置链接 

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息 

     curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头 

     curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式 

     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST数据 

     $response = curl_exec($ch);//接收返回信息 

     if(curl_errno($ch)){//出错则显示错误信息 

     print curl_error($ch); 

     } 

     curl_close($ch); //关闭curl链接 

     echo $response;//显示返回信息 

?> 

 

 2.一个手机上传图片到服务器的小程序

  上传文件

   

<?php 

     //@file phpinput_post.php 

     $data=file_get_contents('btn.png'); 

     $http_entity_body = $data; 

     $http_entity_type = 'application/x-www-form-urlencoded'; 

     $http_entity_length = strlen($http_entity_body); 

     $host = '127.0.0.1'; 

     $port = 80; 

     $path = '/image.php'; 

     $fp = fsockopen($host, $port, $error_no, $error_desc, 30); 

     if ($fp){ 

        fputs($fp, "POST {$path} HTTP/1.1\r\n"); 

        fputs($fp, "Host: {$host}\r\n"); 

        fputs($fp, "Content-Type: {$http_entity_type}\r\n"); 

        fputs($fp, "Content-Length: {$http_entity_length}\r\n"); 

        fputs($fp, "Connection: close\r\n\r\n"); 

        fputs($fp, $http_entity_body . "\r\n\r\n"); 

 

        while (!feof($fp)) { 

         $d .= fgets($fp, 4096); 

        } 

        fclose($fp); 

        echo $d; 

     } 

?> 

 

  接收文件

  

<?php 

        /** 

         *Recieve image data 

        **/    

        error_reporting(E_ALL); 

 

     function get_contents() {    

        $xmlstr= file_get_contents("php://input"); 

        $filename=time().'.png'; 

        if(file_put_contents($filename,$xmlstr)){ 

         echo 'success'; 

        }else

         echo 'failed'; 

        } 

        } 

        get_contents(); 

?>

 3.获取HTTP请求原文

  

/** 

     * 获取HTTP请求原文 

     * @return string 

     */ 

    function get_http_raw() { 

     $raw = ''; 

 

     // (1) 请求行 

     $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; 

 

     // (2) 请求Headers 

     foreach($_SERVER as $key => $value) { 

        if(substr($key, 0, 5) === 'HTTP_') { 

         $key = substr($key, 5); 

         $key = str_replace('_', '-', $key); 

 

         $raw .= $key.': '.$value."\r\n"; 

        } 

     } 

 

     // (3) 空行 

     $raw .= "\r\n"; 

 

     // (4) 请求Body 

     $raw .= file_get_contents('php://input'); 

 

     return $raw; 

}

163月/160

PHP高级编程之消息队列

发布在 邵珠庆

1. 什么是消息队列

消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式

2. 为什么使用消息队列

消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读出。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

3. 什么场合使用消息队列

你首先需要弄清楚,消息队列与远程过程调用的区别,在很多读者咨询我的时候,我发现他们需要的是RPC(远程过程调用),而不是消息队列。

消息队列有同步或异步实现方式,通常我们采用异步方式使用消息队列,远程过程调用多采用同步方式。

MQ与RPC有什么不同? MQ通常传递无规则协议,这个协议由用户定义并且实现存储转发;而RPC通常是专用协议,调用过程返回结果。

4. 什么时候使用消息队列

同步需求,远程过程调用(PRC)更适合你。

异步需求,消息队列更适合你。

目前很多消息队列软件同时支持RPC功能,很多RPC系统也能异步调用。

消息队列用来实现下列需求
  1. 存储转发
  2. 分布式事务
  3. 发布订阅
  4. 基于内容的路由
  5. 点对点连接

5. 谁负责处理消息队列

通常的做法,如果小的项目团队可以有一个人实现,包括消息的推送,接收处理。如果大型团队,通常是定义好消息协议,然后各自开发各自的部分,例如一个团队负责写推送协议部分,另一个团队负责写接收与处理部分。

那么为什么我们不讲消息队列框架化呢?

框架化有几个好处:
  1. 开发者不用学习消息队列接口
  2. 开发者不需要关心消息推送与接收
  3. 开发者通过统一的API推送消息
  4. 开发者的重点是实现业务逻辑功能

6. 怎么实现消息队列框架

下面是作者开发的一个SOA框架,该框架提供了三种接口,分别是SOAP,RESTful,AMQP(RabbitMQ),理解了该框架思想,你很容易进一步扩展,例如增加XML-RPC, ZeroMQ等等支持。

https://github.com/netkiller/SOA

本文只讲消息队列框架部分。

6.1. 守护进程

消息队列框架是本地应用程序(命令行程序),我们为了让他在后台运行,需要实现守护进程。

每个实例处理一组队列,实例化需要提供三个参数,$queueName = '队列名', $exchangeName = '交换名', $routeKey = '路由'

$daemon = new \framework\RabbitDaemon($queueName = 'email', $exchangeName = 'email', $routeKey = 'email');
			

守护进程需要使用root用户运行,运行后会切换到普通用户,同时创建进程ID文件,以便进程停止的时候使用。

守护进程核心代码https://github.com/netkiller/SOA/blob/master/system/rabbitdaemon.class.php

6.2. 消息队列协议

消息协议是一个数组,将数组序列化或者转为JSON推送到消息队列服务器,这里使用json格式的协议。

$msg = array(
	'Namespace'=>'namespace',
	"Class"=>"Email",
	"Method"=>"smtp",
	"Param" => array(
		$mail, $subject, $message, null
	)
);			
			

序列化后的协议

{"Namespace":"single","Class":"Email","Method":"smtp","Param":["netkiller@msn.com","Hello"," TestHelloWorld",null]}			
			

使用json格式是考虑到通用性,这样推送端可以使用任何语言。如果不考虑兼容,建议使用二进制序列化,例如msgpack效率更好。

6.3. 消息队列处理

消息队列处理核心代码

https://github.com/netkiller/SOA/blob/master/system/rabbitmq.class.php

所以消息的处理在下面一段代码中进行

$this->queue->consume(function($envelope, $queue) {

	$speed = microtime(true);
	
	$msg = $envelope->getBody();
	$result = $this->loader($msg);
	$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答

	//$this->logging->info(''.$msg.' '.$result)
	$this->logging->debug('Protocol: '.$msg.' ');
	$this->logging->debug('Result: '. $result.' ');
	$this->logging->debug('Time: '. (microtime(true) - $speed) .'');
});
			

public function loader($msg = null) 负责拆解协议,然后载入对应的类文件,传递参数,运行方法,反馈结果。

Time 可以输出程序运行所花费的时间,对于后期优化十分有用。

提示

loader() 可以进一步优化,使用多线程每次调用loader将任务提交到线程池中,这样便可以多线程处理消息队列。

6.4. 测试

测试代码 https://github.com/netkiller/SOA/blob/master/test/queue/email.php

73月/160

PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

发布在 邵珠庆

     通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便大笑),curl_setopt 是php的一个扩展库

     使用条件:需要在php.ini 中配置开启。(PHP 4 >= 4.0.2)
       //取消下面的注释
       extension=php_curl.dll

      在Linux下面,需要重新编译PHP了,编译时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数。

1、 一个抓取网页的简单案例:

[php][/php] view plain copy
  1. // 创建一个新cURL资源  
  2. $ch = curl_init();  
  3.   
  4. // 设置URL和相应的选项  
  5. curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/");  
  6. curl_setopt($ch, CURLOPT_HEADER, false);  
  7.   
  8. // 抓取URL并把它传递给浏览器  
  9. curl_exec($ch);  
  10.   
  11. //关闭cURL资源,并且释放系统资源  
  12. curl_close($ch);  

2、POST数据案例:

[php][/php] view plain copy
  1. // 创建一个新cURL资源  
  2. $ch = curl_init();  
  3. $data = 'phone='. urlencode($phone);  
  4. // 设置URL和相应的选项  
  5. curl_setopt($ch, CURLOPT_URL, "http://www.post.com/");  
  6. curl_setopt($ch, CURLOPT_POST, 1);  
  7. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
  8. // 抓取URL并把它传递给浏览器  
  9. curl_exec($ch);  
  10.   
  11. //关闭cURL资源,并且释放系统资源  
  12. curl_close($ch);  

3、关于SSL和Cookie

关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。
关于Cookie,你需要了解下面三个参数:
CURLOPT_COOKIE,在当面的会话中设置一个cookie
CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie
CURLOPT_COOKIEFILE,Cookie的文件。

PS:新浪微博登陆API部分截取(部分我增加了点注释,全当参数翻译下。哈哈) 有兴趣的自己研究,自己挪为己用。嘿嘿

[php][/php] view plain copy
  1. /** 
  2.      * Make an HTTP request 
  3.      * 
  4.      * @return string API results 
  5.      * @ignore 
  6.      */  
  7.     function http($url, $method, $postfields = NULL, $headers = array()) {  
  8.         $this->http_info = array();  
  9.         $ci = curl_init();  
  10.         /* Curl settings */  
  11.         curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);//让cURL自己判断使用哪个版本  
  12.         curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);//在HTTP请求中包含一个"User-Agent: "头的字符串。  
  13.         curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);//在发起连接前等待的时间,如果设置为0,则无限等待  
  14.         curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);//设置cURL允许执行的最长秒数  
  15.         curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);//返回原生的(Raw)输出  
  16.         curl_setopt($ci, CURLOPT_ENCODING, "");//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。  
  17.         curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);//禁用后cURL将终止从服务端进行验证  
  18.         curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));//第一个是cURL的资源句柄,第二个是输出的header数据  
  19.         curl_setopt($ci, CURLOPT_HEADER, FALSE);//启用时会将头文件的信息作为数据流输出  
  20.   
  21.         switch ($method) {  
  22.             case 'POST':  
  23.                 curl_setopt($ci, CURLOPT_POST, TRUE);  
  24.                 if (!empty($postfields)) {  
  25.                     curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);  
  26.                     $this->postdata = $postfields;  
  27.                 }  
  28.                 break;  
  29.             case 'DELETE':  
  30.                 curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');  
  31.                 if (!empty($postfields)) {  
  32.                     $url = "{$url}?{$postfields}";  
  33.                 }  
  34.         }  
  35.   
  36.         if ( isset($this->access_token) && $this->access_token )  
  37.             $headers[] = "Authorization: OAuth2 ".$this->access_token;  
  38.   
  39.         $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR'];  
  40.         curl_setopt($ci, CURLOPT_URL, $url );  
  41.         curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );  
  42.         curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );  
  43.   
  44.         $response = curl_exec($ci);  
  45.         $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);  
  46.         $this->http_info = array_merge($this->http_info, curl_getinfo($ci));  
  47.         $this->url = $url;  
  48.   
  49.         if ($this->debug) {  
  50.             echo "=====post data======\r\n";  
  51.             var_dump($postfields);  
  52.   
  53.             echo '=====info====='."\r\n";  
  54.             print_r( curl_getinfo($ci) );  
  55.   
  56.             echo '=====$response====='."\r\n";  
  57.             print_r( $response );  
  58.         }  
  59.         curl_close ($ci);  
  60.         return $response;  
  61.     }  

更详细的参数说明参考:http://cn2.php.net/curl_setopt

 
 
39月/150

解决PHP执行Linux命令

发布在 邵珠庆

一、检查您的php用的是哪个用户组:
可以查看nginx配置文件或者apache配置文件
如:/etc/nginx/nginx.conf 或: /etc/httpd/conf/httpd.conf
也可以用:


比如 我的运行用户组是apache,那么,
二、
vim /etc/sudoer

1.加上www用户 www ALL=(ALL) NOPASSWD:ALL
2. vim 下 / 查找LS_COLORS 将它去掉(Ubuntu没有这个的可以省略)
然后注释掉
Defaults requiretty
Defaults env_reset
这两句!

三、
vim /etc/php.ini
检查:

safe_mode = (这个如果为off下面两个就不用管了)
disable_functions =
safe_mode_exec_dir=
done! 现在您应该可以在php跑linux命令了!

记住一定要重启php-fmp 和nginx

 /etc/init.d/php-fpm restart 

 /etc/init.d/nginx  restart 

111月/150

PHP魔术方法和魔术常量介绍及使用

发布在 邵珠庆

PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

  • __construct(),类的构造函数
  • __destruct(),类的析构函数
  • __call(),在对象中调用一个不可访问方法时调用
  • __callStatic(),用静态方式中调用一个不可访问方法时调用
  • __get(),获得一个类的成员变量时调用
  • __set(),设置一个类的成员变量时调用
  • __isset(),当对不可访问属性调用isset()empty()时调用
  • __unset(),当对不可访问属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这个函数
  • __wakeup(),执行unserialize()时,先会调用这个函数
  • __toString(),类被当成字符串时的回应方法
  • __invoke(),调用函数的方式调用一个对象时的回应方法
  • __set_state(),调用var_export()导出类时,此静态方法会被调用。
  • __clone(),当对象复制完成时调用

__construct()__destruct()

构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

<?php 
class FileRead
{
    protected $handle = NULL;

    function __construct(){
        $this->handle = fopen(...);
    }

    function __destruct(){
        fclose($this->handle);
    }
}
?>

这两个方法在继承时可以扩展,例如:

<?php 
class TmpFileRead extends FileRead
{
    function __construct(){
        parent::__construct();
    }

    function __destruct(){
        parent::__destruct();
    }
}
?>

__call()__callStatic()

在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。

<?php
class MethodTest 
{
    public function __call ($name, $arguments) {
        echo "Calling object method '$name' ". implode(', ', $arguments). "\n";
    }

    public static function __callStatic ($name, $arguments) {
        echo "Calling static method '$name' ". implode(', ', $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
?>

__get()__set()__isset()__unset()

当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量

<?php 
class MethodTest
{
    private $data = array();

    public function __set($name, $value){
        $this->data[$name] = $value;
    }

    public function __get($name){
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
    }

    public function __isset($name){
        return isset($this->data[$name])
    }

    public function unset($name){
        unset($this->data[$name]);
    }
}
?>

__sleep()__wakeup()

当我们在执行serialize()unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:

<?php
class Connection 
{
    protected $link;
    private $server, $username, $password, $db;

    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
?>

__toString()

对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象

<?php
// Declare a simple class
class TestClass
{
    public function __toString() {
        return 'this is a object';
    }
}

$class = new TestClass();
echo $class;
?>

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

__invoke()

调用函数的方式调用一个对象时的回应方法。如下

<?php
class CallableClass 
{
    function __invoke() {
        echo 'this is a object';
    }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

调用var_export()导出类时,此静态方法会被调用。

<?php
class A
{
    public $var1;
    public $var2;

    public static function __set_state ($an_array) {
        $obj = new A;
        $obj->var1 = $an_array['var1'];
        $obj->var2 = $an_array['var2'];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump(var_export($a));
?>

__clone()

当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。

<?php 
public class Singleton {
    private static $_instance = NULL;

    // 私有构造方法 
    private function __construct() {}

    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    // 防止克隆实例
    public function __clone(){
        die('Clone is not allowed.' . E_USER_ERROR);
    }
}
?>

魔术常量(Magic constants)

PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

  • __LINE__,文件中的当前行号
  • __FILE__,文件的完整路径和文件名
  • __DIR__,文件所在的目录
  • __FUNCTION__,函数名称
  • __CLASS__,类的名称
  • __TRAIT__,Trait的名字
  • __METHOD__,类的方法名
  • __NAMESPACE__,当前命名空间的名称

这些魔术常量常常被用于获得当前环境信息或者记录日志。

1211月/140

php/mysql/jquery实现各系统流行的瀑布流显示方式,实现很简单的!!!!

发布在 邵珠庆

大家在用这个东西的时候一定要计得有这么几个文件,一个是jquery.js 还有就是你自己数据库的密码。和相对应的图片才可以正常看到效果。下面就是这里所有的代码!!!

HTML文件:waterfall.html

1. [代码][PHP]代码     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
View Code
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>瀑布流-Derek</title>
 <script type="text/javascript" language="javascript" src="jquery.js"></script>
 <link type="text/css" rel="stylesheet" href="waterfall.css" />
 <script type="text/javascript" language="javascript" src="waterfall.js"></script>
 </head>
 <body>
  
     <ul id="stage">
         <li></li>
         <li></li>
         <li></li>
         <li></li>
     </ul>
  
 </body>
 </html>
/*
 *  Javascript文件:waterfall.js
 */
$(function(){
     jsonajax();
 });
  
 //这里就要进行计算滚动条当前所在的位置了。如果滚动条离最底部还有100px的时候就要进行调用ajax加载数据
 $(window).scroll(function(){   
     //此方法是在滚动条滚动时发生的函数
     // 当滚动到最底部以上100像素时,加载新内容
     var $doc_height,$s_top,$now_height;
     $doc_height = $(document).height();        //这里是document的整个高度
     $s_top = $(this).scrollTop();            //当前滚动条离最顶上多少高度
     $now_height = $(this).height();            //这里的this 也是就是window对象
     if(($doc_height - $s_top - $now_height) < 100) jsonajax();   
 });
  
  
 //做一个ajax方法来请求data.php不断的获取数据
 var $num = 0;
 function jsonajax(){
      
     $.ajax({
         url:'data.php',
         type:'POST',
         data:"num="+$num++,
         dataType:'json',
         success:function(json){
             if(typeof json == 'object'){
                 var neirou,$row,iheight,temp_h;
                 for(var i=0,l=json.length;i<l;i++){
                     neirou = json[i];    //当前层数据
                     //找了高度最少的列做添加新内容
                     iheight  =  -1;
                     $("#stage li").each(function(){
                         //得到当前li的高度
                         temp_h = Number($(this).height());
                         if(iheight == -1 || iheight >temp_h){
                             iheight = temp_h;
                             $row = $(this); //此时$row是li对象了
                         }
                     });
                     $item = $('<div><img src="'+neirou.img+'" border="0" ><br/>'+neirou.title+'</div>').hide();
                     $row.append($item);
                     $item.fadeIn();
                 }
             }
         }
     });
 }
 
/*
 *  CSS文件:waterfall.css
 */
 
body{text-align:center;}
/*Download by http://www.codefans.net*/
#stage{ margin:0 auto; padding:0; width:880px; }
#stage li{ margin:0; padding:0; list-style:none;float:left; width:220px;}
#stage li div{ font-size:12px; padding:10px; color:#999999; text-align:left; }
 
 
/*
 *  php文件:data.php
 */
<?php
 $link = mysql_connect("localhost","root","");
 $sql = "use waterfall";
 mysql_query($sql,$link);
 $sql = "set names utf8";
 mysql_query($sql,$link);
 $num = $_POST['num'] *10;
 if($_POST['num'] != 0) $num +1;
 $sql = "select img,title from content limit ".$num.",10";
 $result = mysql_query($sql,$link);
 $temp_arr = array();
 while($row = mysql_fetch_assoc($result)){
     $temp_arr[] = $row;
 }
 $json_arr = array();
 foreach($temp_arr as $k=>$v){
     $json_arr[]  = (object)$v;
 }
 //print_r($json_arr);
 echo json_encode( $json_arr );

2. [文件] waterfall.zip ~ 8KB     下载(850)     

172月/140

PHP Mailer中文说明

发布在 邵珠庆

A开头:
$AltBody–属性
出自:PHPMailer::$AltBody
文件:class.phpmailer.php
说明:该属性的设置是在邮件正文不支持HTML的备用显示
AddAddress–方法
出自:PHPMailer::AddAddress(),文件:class.phpmailer.php
说明:增加收件人。参数1为收件人邮箱,参数2为收件人称呼。例AddAddress("xiaoxiaoxiaoyu@xiaoxiaoyu.cn","xiaoxiaoyu"),但参数2可选,AddAddress()也是可以的。
函数原型:public function AddAddress($address, $name = ”) {}
AddAttachment–方法
出自:PHPMailer::AddAttachment()
文件:class.phpmailer.php。
说明:增加附件。
参数:路径,名称,编码,类型。其中,路径为必选,其他为可选
函数原型:
AddAttachment($path, $name = ”, $encoding = ‘base64′, $type = ‘application/octet-stream’){}
AddBCC–方法
出自:PHPMailer::AddBCC()
文件:class.phpmailer.php
说明:增加一个密送。抄送和密送的区别请看[SMTP发件中的密送和抄送的区别] 。
参数1为地址,参数2为名称。注意此方法只支持在win32下使用SMTP,不支持mail函数
函数原型:public function AddBCC($address, $name = ”){}
AddCC –方法
出自:PHPMailer::AddCC()
文件:class.phpmailer.php
说明:增加一个抄送。抄送和密送的区别请看[SMTP发件中的密送和抄送的区别] 。
参数1为地址,参数2为名称注意此方法只支持在win32下使用SMTP,不支持mail函数
函数原型:public function AddCC($address, $name = ”) {}
AddCustomHeader–方法
出自:PHPMailer::AddCustomHeader()
文件:class.phpmailer.php
说明:增加一个自定义的E-mail头部。
参数为头部信息
函数原型:public function AddCustomHeader($custom_header){}
AddEmbeddedImage –方法
出自:PHPMailer::AddEmbeddedImage()
文件:class.phpmailer.php
说明:增加一个嵌入式图片
参数:路径,返回句柄[,名称,编码,类型]
函数原型:public function AddEmbeddedImage($path, $cid, $name = ”, $encoding = ‘base64′, $type = ‘application/octet-stream’) {}
提示:AddEmbeddedImage(PICTURE_PATH. "index_01.jpg ", "img_01 ", "index_01.jpg ");
在html中引用<img src= "cid:img_01 ">
AddReplyTo–方法
出自:PHPMailer:: AddReplyTo()
文件:class.phpmailer.php
说明:增加回复标签,如"Reply-to"
参数1地址,参数2名称
函数原型:public function AddReplyTo($address, $name = ”) {}
AddStringAttachment-方法
出自:PHPMailer:: AddStringAttachment()
文件:class.phpmailer.php
说明:增加一个字符串或二进制附件(Adds a string or binary attachment (non-filesystem) to the list.?)
参数:字符串,文件名[,编码,类型]
函数原型:public function AddStringAttachment($string, $filename, $encoding = ‘base64′, $type = ‘application/octet-stream’) {}
Authenticate–方法
出自:SMTP::Authenticate()
文件:class.smtp.php
说明:开始SMTP认证,必须在Hello()之后调用,如果认证成功,返回true,
参数1用户名,参数2密码
函数原型:public function Authenticate($username, $password) {}
B开头
$Body–属性
出自:PHPMailer::$Body
文件: class.phpmailer.php
说明:邮件内容,HTML或Text格式
C开头
$CharSet–属性
出自:PHPMailer::$CharSet
文件:class.phpmailer.php
说明:邮件编码,默认为iso-8859-1
$ConfirmReadingTo–属性
出自:PHPMailer::$ConfirmReadingTo 文件class.phpmailer.php
说明:回执?
$ContentType–属性
出自:PHPMailer::$ContentType
文件: class.phpmailer.php
说明:文档的类型,默认为"text/plain"
$CRLF–属性
出自:PHPMailer::$ContentType
文件:class.phpmailer.php
说明:SMTP回复结束的分隔符(SMTP reply line ending?)
class.phpmailer.php–对象
出自:class.phpmailer.php
文件: class.phpmailer.php
说明:phpmailer对象
class.smtp.php–对象
出自:class.smtp.php 文件: class.smtp.php
说明:SMTP功能的对象
ClearAddresses–方法
出自:PHPMailer::ClearAddresses()
文件: class.phpmailer.php
说明:清除收件人,为下一次发件做准备。返回类型是void
ClearAllRecipients–方法
出自:PHPMailer::ClearAllRecipients()
文件: class.phpmailer.php
说明:清除所有收件人,包括CC(抄送)和BCC(密送)
ClearAttachments–方法
出自:PHPMailer::ClearAttachments()
文件: class.phpmailer.php
说明:清楚附件
ClearBCCs–方法
出自:PHPMailer::ClearBCCs() 文件 class.phpmailer.php
说明:清楚BCC (密送)
ClearCustomHeaders–方法
出自:PHPMailer::ClearCustomHeaders()
文件: class.phpmailer.php
说明:清楚自定义头部
ClearReplyTos–方法
出自:PHPMailer::ClearReplyTos()
文件: class.phpmailer.php
说明:清楚回复人
Close–方法
出自:SMTP::Close()
文件: class.smtp.php
说明:关闭一个SMTP连接
Connect–方法
出自:SMTP::Connect()
文件: class.smtp.php
说明:建立一个SMTP连接[/color]Mailer.html
$ContentType–属性
出自:PHPMailer::$ContentType
文件: class.phpmailer.php
说明:文档的类型,默认为"text/plain"
D开头
$do_debug–属性
出自:SMTP::$do_debug
文件:class.smtp.php
说明:SMTP调试输出
Data-方法
出自:SMTP::Data()
文件:class.smtp.php
说明:向服务器发送一个数据命令和消息信息(sendsthemsg_datatotheserver)
E开头
$Encoding–属性
出自:PHPMailer::$Encoding
文件:class.phpmailer.php
说明:设置邮件的编码方式,可选:"8bit","7bit","binary","base64",和"quoted-printable".
$ErrorInfo–属性
出自:PHPMailer::$ErrorInfo
文件:class.phpmailer.php
说明:返回邮件SMTP中的最后一个错误信息
Expand–方法
出自:SMTP::Expand()
文件:class.smtp.php
说明:返回邮件列表中所有用户。成功则返回数组,否则返回false(Expandtakesthenameandaskstheservertolistallthepeoplewhoaremembersofthe_list_.Expandwillreturnbackandarrayoftheresultorfalseifanerroroccurs.)
F开头:
$From–属性
出自:PHPMailer::$From文件class.phpmailer.php
说明:发件人E-mail地址
$FromName–属性
出自:PHPMailer::$FromName
文件:class.phpmailer.php
说明:发件人称呼
H开头:
$Helo–属性
出自:PHPMailer::$Helo
文件:class.phpmailer.php
说明:设置SMTPHelo,默认是$Hostname(SetstheSMTPHELOofthemessage(Defaultis$Hostname).)
$Host–属性
出自:PHPMailer::$Host
文件:class.phpmailer.php
说明:设置SMTP服务器,格式为:主机名[端口号],如smtp1.example.com:25和smtp2.example.com都是合法的
$Hostname–属性
出自:PHPMailer::$Hostname
文件:class.phpmailer.php
说明:设置在Message-Id和andReceivedheaders中的hostname并同时被$Helo使用。如果为空,默认为SERVER_NAME或’localhost.localdomain"
Hello–方法
出自:SMTP::Hello()
文件:class.smtp.php
说明:向SMTP服务器发送HELO命令
Help–方法
出自:SMTP::Help()
文件:class.smtp.php
说明:如果有关键词,得到关键词的帮助信息
I开头:
IsError–方法
出自:PHPMailer::IsError()
文件:class.phpmailer.php
说明:返回是否有错误发生
IsHTML–方法
出自:PHPMailer::IsHTML()
文件:class.phpmailer.php
说明:设置信件是否是HTML格式
IsMail–方法
出自:PHPMailer::IsMail()
文件:class.phpmailer.php
说明:设置是否使用php的mail函数发件
IsQmail–方法
出自:PHPMailer::IsQmail()
文件:class.phpmailer.php
说明:设置是否使用qmailMTA来发件
IsSendmail–方法
出自:PHPMailer::IsSendmail()
文件:class.phpmailer.php
说明:是否使用$Sendmail程序来发件
IsSMTP–方法
出自:PHPMailer::IsSMTP()
文件:class.phpmailer.php
说明:是否使用SMTP来发件
M开头:
$Mailer–属性
出自:PHPMailer::$Mailer
文件:class.phpmailer.php
说明:发件方式,("mail","sendmail",or"smtp").中的一个
Mail–方法
出自:SMTP::Mail()
文件:class.smtp.php
说明:从$from中一个邮件地址开始处理,返回true或false。如果是true,则开始发件
N开头:
Noop–方法
出自:SMTP::Noop()
文件:class.smtp.php
说明:向SMTP服务器发送一个NOOP命令
P开头:
$Password–属性
出自:PHPMailer::$Password
文件:class.phpmailer.php
说明:设置SMTP的密码
$PluginDir–属性
出自:PHPMailer::$PluginDir
文件:class.phpmailer.php
说明:设置phpmailer的插件目录,仅在smtpclass不在phpmailer目录下有效
$Port–属性
出自:PHPMailer::$Port
文件:class.phpmailer.php
说明:设置SMTP的端口号
$Priority–属性
出自:PHPMailer::$Priority
文件:class.phpmailer.php
说明:设置邮件投递优先等级。1=紧急,3=普通,5=不急
PHPMailer–对象
出自:PHPMailer
文件:class.phpmailer.php
说明:PHPMailer-PHPemailtransportclass
Q开头
Quit–方法
出自:SMTP::Quit()
文件:class.smtp.php
说明:向服务器发送Quit命令,如果没有错误发生。那么关闭sock,不然$close_on_error为true
R开头
Recipient–方法
出自:SMTP::Recipient()
文件:class.smtp.php
说明:使用To向SMTP发送RCPT命令,参数为:$to
Reset–方法
出自:SMTP::Reset()
文件:class.smtp.php
说明:发送RSET命令从而取消处理中传输。成功则返回true,否则为false
S开头:
$Sender–属性
出自:PHPMailer::$Sender
文件:class.phpmailer.php
说明:SetstheSenderemail(Return-Path)ofthemessage.Ifnotempty,willbesentvia-ftosendmailoras’MAILFROM’insmtpmode.
$Sendmail–属性
出自:PHPMailer::$Sendmail
文件:class.phpmailer.php
说明:设置发件程序的目录
$SMTPAuth–属性
出自:PHPMailer::$SMTPAuth
文件:class.phpmailer.php
说明:设置SMTP是否需要认证,使用Username和Password变量
$SMTPDebug–属性
出自:PHPMailer::$SMTPDebug
文件:class.phpmailer.php
说明:设置SMTP是否调试输出?
$SMTPKeepAlive–属性
出自:PHPMailer::$SMTPKeepAlive
文件:class.phpmailer.php
说明:在每次发件后不关闭连接。如果为true,则,必须使用SmtpClose()来关闭连接
$SMTP_PORT–属性
出自:SMTP::$SMTP_PORT
文件:class.smtp.php
说明:设置SMTP端口
$Subject–属性
出自:PHPMailer::$Subject
文件:class.phpmailer.php
说明:设置信件的主题
Send–方法
出自:SMTP::Send()
文件:class.smtp.php
说明:从指定的邮件地址开始一个邮件传输
Send–方法
出自:PHPMailer::Send()
文件:class.phpmailer.php
说明:创建邮件并制定发件程序。如果发件不成功,则返回false,请使用ErrorInfo来查看错误信息
SendAndMail–方法
出自:SMTP::SendAndMail()
文件:class.smtp.php
说明:从指定的邮件地址开始一个邮件传输
SendOrMail–方法
出自:SMTP::SendOrMail()
文件:class.smtp.php
说明:从指定的邮件地址开始一个邮件传输
SetLanguage–方法
出自:PHPMailer::SetLanguage()
文件:class.phpmailer.php
说明:设置phpmailer错误信息的语言类型,如果无法加载语言文件,则返回false,默认为english
SMTP–方法
出自:SMTP::SMTP()
文件:class.smtp.php
说明:初始化一个对象以便数据处于一个已知的状态
SMTP–对象
出自:SMTP
文件:class.smtp.php
说明:SMTP对象
SmtpClose–方法
出自:PHPMailer::SmtpClose()
文件:class.phpmailer.php
说明:如果有活动的SMTP则关闭它。
T开头
$Timeout–属性
出自:PHPMailer::$Timeout
文件:class.phpmailer.php
说明:设置SMTP服务器的超时(单位:秒)。注意:在win32下,该属性无效
Turn–方法
出自:SMTP::Turn()
文件:class.smtp.php
说明:这是一个可选的SMTP参数,目前phpmailer并不支持他,可能未来支持
U开头
$Username–属性
出自:PHPMailer::$Username
文件:class.phpmailer.php
说明:设置SMTP用户名
V开头
$Version–属性
出自:PHPMailer::$Version
文件:class.phpmailer.php
说明:返回Phpmailer的版本
Verify–方法
出自:SMTP::Verify()
文件:class.smtp.php
说明:通过服务器检查用户名是否经过验证
W开头:
$WordWrap–属性
出自:PHPMailer::$WordWrap
文件:class.phpmailer.php
说明:设置每行最大字符数,超过改数后自动换行

   下一页