php相关

来源:互联网 发布:js 时间戳格式化函数 编辑:程序博客网 时间:2024/06/06 03:53

php.ini中error_reporting参数配置

php.ini中的error_reporting参数的配置。

error_reporting可以设置的参数,如下:
错误报告是位字段。可以将数字加起来得到想要的错误报告等级。
 

E_ALL – 所有的错误和警告(不包括 E_STRICT)
E_ERROR – 致命性的运行时错误
E_WARNING – 运行时警告(非致命性错误)
E_PARSE – 编译时解析错误
E_NOTICE – 运行时提醒(这些经常是你代码中的bug引起的,也可能是有意的行为造成的。)
E_STRICT – 编码标准化警告,允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性。
E_CORE_ERROR – PHP启动时初始化过程中的致命错误
E_CORE_WARNING – PHP启动时初始化过程中的警告(非致命性错)
E_COMPILE_ERROR – 编译时致命性错
E_COMPILE_WARNING – 编译时警告(非致命性错)
E_USER_ERROR – 用户自定义的错误消息
E_USER_WARNING – 用户自定义的警告消息
E_USER_NOTICE – 用户自定义的提醒消息

一般设置为:
error_reporting = E_ALL & ~E_NOTICE ; 除提示外,显示所有的错误。。。
 
例子:
 

代码示例:
<?php
error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示编译时致命性错误
error_reporting=E_ERROR :只会报告致命性错误

还可以在php程序中,对error_reporting进行设置,例如:
error_reporting(E_ALL);


-------------------------------------------------------------------------------------------------------------------

使用 PHP 直接在共享内存中存储数据集

概述

共享内存是一种在相同机器中的应用程序之间交换数据的有效方式。一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限。每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它。创建并提供了合适的权限之后,同一台机器中的其他进程就可以操作这些内存段:读取、写入和删除。

这表明使用 C 语言编写的应用程序可与使用其他语言(比如 Java™ 或 PHP)编写的应用程序共享信息。它们都可以共享信息,只要它们可访问和理解该信息。共享内存在针对大部分语言的实现中得到了广泛使用,所以访问应该不是问题。要理解信息,我们可以使用一种标准格式,比如 XML 或 JSON。

共享内存的使用是一种在进程之间交换数据的快速方法,主要因为在创建内存段之后传递数据,不会涉及内核。这种方法常常称为进程间通信 (IPC)。其他 IPC 方法包括管道、消息队列、RPC 和套接字。当使用需要彼此通信的应用程序的生态系统时,这种在应用程序之间快速、可靠地交换数据的能力非常有用。取决于生态系统的大小,使用数据库在应用程序之间交换信息的常用方法常常会导致查询缓慢,甚至 I/O 阻塞。使用共享内存,没有 I/O 会减缓开发人员的进度。

本文的提议非常简单,学习如何使用 PHP 创建和操作共享内存段,使用它们存储可供其他应用程序使用的数据集。即使没有使用共享内存交换数据的计划,它本身也在许多好处,因为它使应用程序能够远离 I/O 问题。将数据集直接存储在内存中具有诸多优势,从 Web 服务数据缓存到会话共享。它是一个非常有用的概念,每个 PHP 开发人员都应该知道。

共享内存和 PHP

PHP 拥有丰富的可用扩展,共享内存也一样。使用一些共享的函数,无需安装任何扩展,开发人员就能够轻松操作内存段。

创建内存段

共享内存函数类似于文件操作函数,但无需处理一个流,您将处理一个共享内存访问 ID。第一个示例就是 shmop_open 函数,它允许您打开一个现有的内存段或创建一个新内存段。此函数非常类似于经典的 fopen 函数,后者打开用于文件操作的流,返回一个资源供其他希望读取或写入该打开的流的函数使用。让我们看看清单 1 中的 shmop_open

清单 1. shmop_open 函数
<?php$systemid = 864; // System ID for the shared memory segment$mode = "c"; // Access mode$permissions = 0755; // Permissions for the shared memory segment$size = 1024; // Size, in bytes, of the segment$shmid = shmop_open($systemid, $mode, $permissions, $size);?>

该函数中出现的第一个事物是系统 ID 参数。这是标识系统中的共享内存段的数字。第二个参数是访问模式,它非常类似于 fopen 函数的访问模式。您可以在 4 种不同的模式下访问一个内存段:

  • 模式 “a”,它允许您访问只读内存段
  • 模式 “w”,它允许您访问可读写的内存段
  • 模式 “c”,它创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写
  • 模式 “n”,它创建一个新内存段,如果该内存段已存在,则会失败

第三个参数是内存段的权限。您必须在这里提供一个八进制值。

第四个参数提供内存段大小,以字节为单位。在写入一个内存段之前,您必须在它之上分配适当的字节数。

请注意,此函数返回一个 ID 编号,其他函数可使用该 ID 编号操作该共享内存段。这个 ID 是共享内存访问 ID,与系统 ID 不同,它以参数的形式传递。请注意不要混淆这两者。如果失败,shmop_open 将返回 FALSE。

向内存段写入数据

使用 shmop_write 函数向共享内存块写入数据。此函数的使用很简单,它仅接受 3 个参数,如清单 2 所示。

清单 2. 使用 shmop_write 向共享内存块写入数据
<?php$shmid = shmop_open(864, 'c', 0755, 1024);shmop_write($shmid, "Hello World!", 0);?>

这个函数类似于 fwrite 函数,后者有两个参数:打开的流资源(由 fopen 返回)和您希望写入的数据。shmop_write 函数也执行此任务。

第一个参数是 shmop_open 返回的 ID,它识别您操作的共享内存块。第二个参数是您希望存储的数据,最后的第三个参数是您希望开始写入的位置。默认情况下,我们始终使用 0 来表示开始写入的位置。请注意,此函数在失败时会返回 FALSE,在成功时会返回写入的字节数。

从内存段读取数据

从共享内存段读取数据很简单。您只需要一个打开的内存段和 shmop_read 函数。此函数接受一些参数,工作原理类似于 fread。参见清单 3,读取一个 PHP 文件的内容。

清单 3. 使用 shmop_read 读取一个文件的内容
<?php$stream = fopen('file.txt', 'r+');fwrite($stream, "Hello World!");echo fread($stream, 11);?>

读取共享内存段的内容的过程与此类似,如清单 4 所示:

清单 4. 读取共享内存段的内容
<?php$shmid = shmop_open(864, 'c', 0755, 1024);shmop_write($shmid, "Hello World!", 0);echo shmop_read($shmid, 0, 11);?>

请留意这里的参数。shmop_read 函数将接受 shmop_open 返回的 ID,我们已知道它,不过它还接受另外两个参数。第二个参数是您希望从内存段读取的位置,而第三个是您希望读取的字节数。第二个参数可以始终为 0,表示数据的开头,但第三个参数可能存在问题,因为我们不知道我们希望读取多少字节。

这非常类似于我们在 fread 函数中的行为,该函数接受两个参数:打开的流资源(由 fopen 返回)和您希望从该流读取的字节数。使用filesize 函数(它返回一个文件中的字节数)来完整地读取它。

幸运的是,当使用共享内存段时,shmop_size 函数返回一个内存段的大小(以字节为单位),类似于 filesize 函数。参见清单 5。

清单 5. shmop_size 函数返回内存段大小,以字节为单位
<?php$shmid = shmop_open(864, 'c', 0755, 1024);shmop_write($shmid, "Hello World!", 0);$size = shmop_size($shmid);echo shmop_read($shmid, 0, $size);?>

删除内存段

我们学习了如何打开、写入和读取共享内存段。要完成我们的 CRUD 类,我们还需要学习如何删除内存段。该任务可使用 shmop_delete 函数轻松完成,该函数仅接受一个参数:我们希望删除的共享内存 ID。

清单 6. shmop_delete 标记要删除的内存段
<?php$shmid = shmop_open(864, 'c', 0755, 1024);shmop_write($shmid, "Hello World!", 0);shmop_delete($shmid);?>

这不会实际删除该内存段。它将该内存段标记为删除,因为共享内存段在有其他进程正在使用它时无法被删除。shmop_delete 函数将该内存段标记为删除,阻止任何其他进程打开它。要删除它,我们需要关闭该内存段。

关闭内存段

打开一个共享内存段会 “附加” 到它。附加该内存段之后,我们可在其中进行读取和写入,但完成操作后,我们必须从它解除。这使用清单 7 中的 shmop_close 函数来完成。

这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。

清单 7. 使用 shmop_close 与一个内存段分开
<?php$shmid = shmop_open(864, 'c', 0755, 1024);shmop_write($shmid, "Hello World!", 0);shmop_delete($shmid);shmop_close($shmid);?>

使用共享内存作为一个存储选项

有了共享内存和共享内存段上基本 CRUD 操作的基本知识,是时候应用此知识了。我们可以使用共享内存作为一种独特的存储选项,提供快速读/写操作和进程互操作性等优势。对于 Web 应用程序,这意味着:

  • 缓存存储(数据库查询、Web 服务数据、外部数据)
  • 会话存储
  • 应用程序之间的数据交换

在继续之前,我想介绍一个名为 SimpleSHM 小型库。SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段。在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码。要了解 SimpleSHM,请访问GitHub 页面。

您可以使用 3 个方法进行处理:读、写和删除。从该类中简单地实例化一个对象,可以控制打开的共享内存段。清单 8 展示了基本用途。

清单 8. SimpleSHM 基本用途
<?php$memory = new SimpleSHM;$memory->write('Sample');echo $memory->read();?>

请注意,这里没有为该类传递一个 ID。如果没有传递 ID,它将随机选择一个编号并打开该编号的新内存段。我们可以以参数的形式传递一个编号,供构造函数打开现有的内存段,或者创建一个具有特定 ID 的内存段,如清单 9 所示。

清单 9. 打开一个特定的内存段
<?php$new = new SimpleSHM(897);$new->write('Sample');echo $new->read();?>

神奇的方法 __destructor 负责在该内存段上调用 shmop_close 来取消设置对象,以与该内存段分离。我们将这称为 “SimpleSHM 101”。现在让我们将此方法用于更高级的用途:使用共享内存作为存储。存储数据集需要序列化,因为数组或对象无法存储在内存中。尽管这里使用了 JSON 来序列化,但任何其他方法(比如 XML 或内置的 PHP 序列化功能)也已足够。清单 10 给出了一个示例。

清单 10. 使用共享内存作为存储
<?phprequire('SimpleSHM.class.php');$results = array('user' => 'John','password' => '123456','posts' => array('My name is John', 'My name is not John'));$data = json_encode($results);$memory = new SimpleSHM;$memory->write($data);$storedarray = json_decode($memory->read());print_r($storedarray);?>

我们成功地将一个数组序列化为一个 JSON 字符串,将它存储在共享内存块中,从中读取数据,去序列化 JSON 字符串,并显示存储的数组。这看起来很简单,但请想象一下这个代码片段带来的可能性。您可以使用它存储 Web 服务请求、数据库查询或者甚至模板引擎缓存的结果。在内存中读取和写入将带来比在磁盘中读取和写入更高的性能。

使用此存储技术不仅对缓存有用,也对应用程序之间的数据交换也有用,只要数据以两端都可读的格式存储。不要低估共享内存在 Web 应用程序中的力量。可采用许多不同的方式来巧妙地实现这种存储,惟一的限制是开发人员的创造力和技能。



-------------------------------------------------------------------------------------------------------------------


php取整的几种方式


floor 舍去法取整 

语法格式:float floor ( float value )
返回不大于value 的下一个整数,将value 的小数部分舍去取整。floor() 返回的类型仍然是float,因为float 值的范围通常比integer 要大。
echo floor(7.1);   // 7
echo floor(9.98); // 9

ceil 进一法取整 

语法格式: float ceil ( float value )
返回不小于value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是float,因为float 值的范围通常比integer 要大
echo ceil(5.3);    // 6
echo ceil(9.93);  // 10

round 对浮点数进行四舍五入

语法:float round ( float val [, int precision] )
echo round(1.4);         // 1
echo round(1.5);         // 2
echo round(1.6);         // 2
echo round(1.6, 0);      // 2
echo round(1.34544, 2);  // 1.35
echo round(1552324, -3); // 1552000
echo round(11.115, 2);    // 11.12
echo round(11.115, 3);    // 11.115

intval 变量转成整数类型

语法: int intval(mixed var, int [base])
返回值: 整数
内容说明:本函数可将变量转成整数类型。可省略的参数 base 是转换的基底(这也是与“(int)”的区别所在),默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。intval返回的值在一个4字节所能表示的范围之内(-2147483648~2147483647),对于超过这个范围的值将用边界值代替。 
intval("A")=0;
intval(23.2453)=23; 
intval("6742jdsfiKDSFJ5683")=6742;


-------------------------------------------------------------------------------------------------------------------

用php curl 模拟post 提交


  1. <?php  
  2. $post_data =   
  3.             array(  
  4.                     'openid=N76DH88',  
  5.                     'user=Roy001'
  6.             );  
  7.   
  8.     $post_data = implode('&',$post_data);  
  9.   
  10.     $url='http://192.168.0.222/log/';  
  11.   
  12.     $ch = curl_init();  
  13.     curl_setopt($ch, CURLOPT_POST, 1);  
  14.     curl_setopt($ch, CURLOPT_URL,$url);  
  15.     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);  
  16.     ob_start();  
  17.     curl_exec($ch);  
  18.     $result = ob_get_contents() ;  
  19.     ob_end_clean();  
  20.   
  21. echo $result;  
  22.   
  23.   
  24. ?>  



-------------------------------------------------------------------------------------------------------------------

PHP 函数 file_get_contents 与 curl 效率及稳定性问题

习惯了使用方便快捷的file_get_contents函数抓取别家网站内容,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不好使:
1    $config['context'] = stream_context_create(array('http' => array('method' => "GET",'timeout' => 5)));

其中,’timeout’ => 5//这个超时时间不稳定。这时候,看一下服务器的连接池,会发现一堆类似下面的错误,让你头疼万分:
1    file_get_contents(http://***): failed to open stream…

安装了curl库,写一个函数替换:
function curl_get_contents($url)
{
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);            //设置访问的url地址
     //curl_setopt($ch,CURLOPT_HEADER,1);            //是否显示头部信息
     curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时
     curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);   //用户访问代理 User-Agent
     curl_setopt($ch, CURLOPT_REFERER,_REFERER_);        //设置 referer
     curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果
     $r = curl_exec($ch);
     curl_close($ch);
     return $r;
}

如此,除了真正的网络问题外,没再出现任何问题。

这是关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:
1    2.31319094
2    2.30374217
3    2.21512604
4    3.30553889
5    2.30124092

curl使用的时间:
1    0.68719101
2    0.64675593
3    0.64326
4    0.81983113
5    0.63956594

-------------------------------------------------------------------------------------------------------------------

PHP获取http头信息,HTTP_RAW_POST_DATA与 php://input的区别分析

获取http请求的头信息。

PHP手册提供了现成的函数:

(PHP 4, PHP 5)

getallheaders — Fetch all HTTP request headers


array getallheaders ( void )

Fetches all HTTP headers from the current request.

This function is an alias for apache_request_headers(). Please read theapache_request_headers() documentation for more information on how this function works.

An associative array of all the HTTP headers in the current request, orFALSE on failure. 


Example #1 getallheaders() example


[php] view plaincopy
  1. <?php  
  2.   
  3. foreach (getallheaders() as $name => $value) {  
  4.     echo "$name: $value\n";  
  5. }  
  6.   
  7. ?>   
不过这个函数只能在apache环境下使用,iis或者nginx并不支持,可以通过自定义函数实现

[php] view plaincopy
  1. <?php   
  2. <span class="html">if (!function_exists('getallheaders'))   
  3. {  
  4.     function getallheaders()   
  5.     {  
  6.        foreach ($_SERVER as $name => $value)   
  7.        {  
  8.            if (substr($name, 0, 5) == 'HTTP_')   
  9.            {  
  10.                $headers[str_replace(' ''-', ucwords(strtolower(str_replace('_'' 'substr($name, 5)))))] = $value;  
  11.            }  
  12.        }  
  13.        return $headers;  
  14.     }  
  15. }</span>   
  16. ?>   

好了,看看都打印出了啥吧

[php] view plaincopy
  1. <?php  
  2. print_r(getallheaders());  

获得结果:
[html] view plaincopy
  1. Array  
  2. (  
  3.     [Accept] => */*  
  4.     [Accept-Language] => zh-cn  
  5.     [Accept-Encoding] => gzip, deflate  
  6.     [User-Agent] => Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)  
  7.     [Host] => localhost  
  8.     [Connection] => Keep-Alive  
  9. )  


-------------------------------------------------------------------------------------------------------------------
手册里写:总是产生变量包含有原始的 POST 数据。否则,此变量仅在碰到未识别 MIME 类型的数据时产生。不过,访问原始 POST 数据的更好方法是 php://input。$HTTP_RAW_POST_DATA 对于 enctype="multipart/form-data" 表单数据不可用。 


问题:    $HTTP_RAW_POST_DATA  == $_POST  吗?


照手册所写 ,答案应该就为否。
假如不一样的话,他们的区别是什么呢?




我知道答案了,如下:


The RAW / uninterpreted HTTP POst information can be accessed with:
   $GLOBALS['HTTP_RAW_POST_DATA']
This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).


也就是说,基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一样的。但是如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等。


PHP默认识别的数据类型是application/x-www.form-urlencoded标准的数据类型


用Content-Type=text/xml 类型,提交一个xml文档内容给了php server,要怎么获得这个POST数据。 


The RAW / uninterpreted HTTP POST information can be accessed with:   $GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).


由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。


另外还有一项 php://input 也可以实现此这个功能


php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。 




应用 






a.htm   
  ------------------   
  <form   action="post.php"   method="post">   
      <input   type="text"   name="user">   
      <input   type="password"   name="password">   
      <input   type="submit">   
  </form>      
    
  post.php   
  ----------------------------   
  <?   echo   file_get_contents("php://input");   ?>   


-------------------------------------------------------------------------------------------------------------------



php中序列化与反序列化

转自:http://qing.weibo.com/tag/unserialize

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
eg:
$stooges = array('Moe','Larry','Curly');
$new = serialize($stooges);
print_r($new);echo "<br />";
print_r(unserialize($new));
结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] => Moe [1] => Larry [2] => Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">next</a>';
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启
$new_cart = unserialize($cart);
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
复制代码
$fp = fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));
//如果magic_quotes_runtime关闭
$new_cat = unserialize(file_get_contents('/tmp/cart'));
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')");
$rs = mysql_query('select data from cart where id=1');
$ob = mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart = unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart = unserialize($ob->data);
复制代码
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。


-------------------------------------------------------------------------------------------------------------------
0 0