您的位置:

php缺省参数,函数缺省参数

本文目录一览:

php带缺省参数问题

!($p_start -1 $p_count -1) or $sql .= " limit ".$p_start.",".$p_count;

不用if也可以照常判断吧,判断不限于if, if仅限于判断,

PHP是什么

PHP(PHP:Hypertext Preprocessor递归缩写)中文名字是:“超文本预处理器”,是一种广泛使用的通用开源脚本语言,适合于Web网站开发,它可以嵌入HTML中。编程范型是面向对象、命令式编程的,截止2019年4月24日为止,最新的版本是PHP 5.6.0(28 Aug 2014),其操作的系统为windows/linux/Mac跨平台。

扩展资料:

PHP的功能

1、创建博客

使用PHP创建博客wordpres,可以轻松创建博客。即使您不具备PHP知识,也可以使用它,但如果您可以编写PHP,则可以自定义您的博客并创建主题。

2、网站开发

60%全球互联网网站采用php技术,80%国内互联网网站使用php开发。这些网站包含购物网站,政府企业网站,QQ空间,论坛博客等等。

3、移动端微网站开发以及小程序

移动设备的普及为移动互联网的快速发展奠定了基础!手机淘宝网站,手机京东网站等等, 微信公众号应用中的微网站。

参考资料来源:百度百科——PHP

php是????????

PHP 是一种流行的开放源代码的脚本语言。PHP早期的缩写是“Personal HomePage”,现在官方正式名称为“PHP: Hypertext Preprocessor”的递归缩写。

PHP主要用于服务器端应用程序及动态网页上,但是也可以用在命令列上执行,或是开发独立的窗口程序接口(GUI)

开发历史

1994年,加拿大籍的程序设计师Rasmus Lerdorf开发了一组以C语言为基础的CGI程序,目的是要取代一些用来维护他个人网站的Perl程序,不久之后,他把这些CGI程序公布并取名为"Personal Home Page Tools",这也是PHP名称的由来。Rasmus Lerdorf一直维护PHP语言直到PHP第二版,使用的解析引擎为PHP/FI。

[编辑] PHP 3

1997年,Tel Aviv 公司的Zeev Suraski 和 Andi Gutmans 改写了原本的解析引擎PHP/FI,并把PHP重新命名为"PHP: Hypertext Preprocessor"。在1998年公布了PHP 3提供大众下载测试,1999年两人在以色列成立了Zend Technologies公司来投入PHP的开发工作,并且开始制作下一代的解析引擎 - Zend引擎。

[编辑] PHP 4

2000年5月22日,以Zend引擎 1.0为解析引擎的PHP 4.0 发布。这也是PHP开始大受欢迎的版本,目前PHP 4还有在做安全性的更新,最新的版本是2006年九月发布的PHP 4.4.4版。

[编辑] PHP 5

2004年7月13日,以Zend引擎II为基础的PHP 5.0 发布,同时也加入了许多新特性:

更完整的面向对象支持:基本上到PHP 5之后PHP才算是比较完整的面向对象语言。

透过新的Zend引擎,提升了PHP执行的速度。

对MySQL数据库有更完整的支持。

更佳的XML支持。

内建SQLite数据库(但在PHP 5.1取消了内建,改用扩展函数库的方式)。

整合了SOAP的支持。

提供许多程序语言有的例外处理功能。

实验性的介绍新的数据库存取接口PDO(PHP Data Objects),在PHP5.1则开始缺省安装PDO。

最新的版本是2006年11月发布的5.2.0

[编辑] 应用

PHP主要应用在网页服务器,处理使用者的输入来产生网页。但是命令列脚本或是视窗程序接口(GUI)的开发也是PHP的主要应用范围

[编辑] 服务器端脚本语言

PHP最初就是设计成服务器端脚本语言,因此这也是PHP应用最广的部份。在此领域有许多其他的竞争者,例如ASP.NET、ColdFusion、JSP、Perl、Ruby on Rails等等。

在网络工业领域,PHP是LAMP架构的其中一部分,所谓的LAMP是指Linux、Apache、MySQL、以及PHP所组成的网络环境,提供了许多安全、可靠的网页应用程序。PHP目前已经是全世界最受欢迎的服务器端脚本语言,跨平台的特性更是让PHP广为流传,目前共有1800万台服务器安装有PHP。

[编辑] 命令列脚本

PHP也可以用命令列上执行来使用,例如分析纪录档、系统管理工作等。这些工作过去都是由一些其他的脚本语言例如Perl, Python, awk等来执行,PHP的在命令列上的使用则逐渐增加。

[编辑] 视窗程序接口(GUI)

透过和GUI函式库GTK+的结合,PHP也可以应用在视窗程序接口(GUI)的开发上,目前的应用还不普遍。

[编辑] 语法

Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

?php

echo 'Hello World!';

?

?

print 'Hello World!';

?

从中我们可以看出,PHP语言是嵌入在“?php...?”或“?...?” 之间的部分。而这个程序最终结果将是:

Hello World!

但建议您使用 ?php ... ? 此种方式撰写您的程序,因为在XML中使用? ?作为标签,在php缺省的设定档php.ini中,通常此设定值为Off,若您有打开此设定的需要,您可以参见 php.ini 中关于 “short_open_tag = Off ”这部份的设定。

[编辑] PHP相关资源

[编辑] 函式库

主条目:PHP函式库列表

内建多样化的函数是PHP主要的特点之一,这些开放程序码的函数提供了各种不同的功能,例如档案处理、FTP、字串处理、等等。这些函数的使用方法和C语言相近(例如printf),这也是PHP广为流行的原因之一。

除了内建的函数之外,PHP也提供了很多延伸函式库(extension),像是各种数据库连接函数、资料压缩函数、图形处理等等。有些延伸函式库需要从PECL(PHP Extension Community Library)取得。

[编辑] 原始码编码和加速

PHP原始码是可以直接读取的,即使放到服务器上执行也是一样。虽然让PHP多了弹性,但相对的会造成安全危机和性能下降的问题。

因此透过PHP编码器,可以保护PHP的原始码不被读取(对商业软件来说特别有需求),也可以提升执行的效能。有许多公司或团体开发PHP的编码器,将PHP程序编译成字节码,再透过服务器上安装对应的程序来执行PHP脚本。

除了透过编码器加速之外,PHP还可以透过动态的快取机制来提升速度,加速工具有商业版的(例如Zend Platform),也有开放原始码的(例如eAccelerator, APC)。

[编辑] 样板引擎

Smarty

Smarty是一个php模板引擎.

更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法,可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下 ,他们不可能是同一个人.例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现.在Smarty的程序里,这些被忽略了.模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表格,背景色,字体大小,样式表,等等).有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变).这个改变不影响模板设计者,内容仍将准确的输出到模板.同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑.

程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑

[编辑] PEAR

[编辑] PECL

[编辑] 对PHP的批评

PHP没有原生支援Unicode或是多位元字集(例如中文、日文、韩文等需要用两个以上为原来表示的字集),导致用PHP写的软件在国际语言化上遇到相当多的困难。

PHP没有名称空间(Namespace)的设计,降低了PHP语言设计上的弹性。预计在PHP 6会加入名称空间的特性。

PHP的函数命名规则非常的混乱,而且许多函数往往作用类似,只是传递的参数不同就要分成不同的函数,导致编写PHP程序时需要做相当多的手册查询工作,降低开发的效率。

PHP的魔术引号(magic quotes)功能可以自动处理使用者输入字串中的跳脱字符,有效避免SQL隐码攻击(SQL injection),但是因为不是每个使用者的输入都会写入到数据库,处理这些没有写入数据库的字串便浪费了效能。此外不是每个PHP环境都会开启魔术引号,程序设计时需要便需要对不同的服务器环境做因应,造成程序设计上的麻烦。魔术引号功能预计将会于PHP 6时取消。

有些PHP延伸函式库不是执行绪安全(threadsafe),导致PHP安装在多执行绪的服务器例如Apache 2上会发生不稳定的状况。

几种常见的PHP超时处理方法

【Web服务器超时处理】

[ Apache ]

一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时操作。

目前apachefastcgiphp-fpm模式下有三个超时设置:

fastcgi超时设置:

修改的fastcgi连接配置,类似如下:

复制代码 代码如下:

IfModulemod_fastcgi.c

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock

ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"

AddHandlerphp-fastcgi.php

Actionphp-fastcgi/fcgi-bin/php-cgi

AddTypeapplication/x-

/IfModule

缺省配置是30s,如果需要定制自己的配置,需要修改配置,比如修改为100秒:(修改后重启apache):

复制代码 代码如下:

IfModulemod_fastcgi.c

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100

ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"

AddHandlerphp-fastcgi.php

Actionphp-fastcgi/fcgi-bin/php-cgi

AddTypeapplication/x-

/IfModule

如果超时会返回500错误,断开跟后端php服务的连接,同时记录一条apache错误日志:

[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)

[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"

其他fastcgi配置参数说明:

复制代码 代码如下:

IdleTimeout发呆时限

ProcessLifeTime一个进程的最长生命周期,过期之后无条件kill

MaxProcessCount最大进程个数

DefaultMinClassProcessCount每个程序启动的最小进程个数

DefaultMaxClassProcessCount每个程序启动的最大进程个数

IPCConnectTimeout程序响应超时时间

IPCCommTimeout与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的

MaxRequestsPerProcess每个进程最多完成处理个数,达成后自杀

[ Lighttpd ]

配置:lig

Lighttpd配置中,关于超时的参数有如下几个(篇幅考虑,只写读超时,写超时参数同理):

主要涉及选项:

server.max-keep-alive-idle=5

server.max-read-idle=60

server.read-timeout=0

server.max-connection-idle=360

复制代码 代码如下:

#每次keep-alive的最大请求数,默认值是16

server.max-keep-alive-requests=100

#keep-alive的最长等待时间,单位是秒,默认值是5

server.max-keep-alive-idle=1200

#lighttpd的work子进程数,默认值是0,单进程运行

server.max-worker=2

#限制用户在发送请求的过程中,最大的中间停顿时间(单位是秒),

#如果用户在发送请求的过程中(没发完请求),中间停顿的时间太长,lighttpd会主动断开连接

#默认值是60(秒)

server.max-read-idle=1200

#限制用户在接收应答的过程中,最大的中间停顿时间(单位是秒),

#如果用户在接收应答的过程中(没接完),中间停顿的时间太长,lighttpd会主动断开连接

#默认值是360(秒)

server.max-write-idle=12000

#读客户端请求的超时限制,单位是秒,配为0表示不作限制

#设置小于max-read-idle时,read-timeout生效

server.read-timeout=0

#写应答页面给客户端的超时限制,单位是秒,配为0表示不作限制

#设置小于max-write-idle时,write-timeout生效

server.write-timeout=0

#请求的处理时间上限,如果用了mod_proxy_core,那就是和后端的交互时间限制,单位是秒

server.max-connection-idle=1200

说明:

对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数max-keep-alive-idle决定。请求间的间隔超时也由max-keep-alive-idle决定。发送请求内容的总时间超时由参数read-timeout决定。Lighttpd与后端交互数据的超时由max-connection-idle决定。

延伸阅读:

[ Nginx ]

配置:nf

复制代码 代码如下:

http{

#Fastcgi:(针对后端的fastcgi生效,fastcgi不属于proxy模式)

fastcgi_connect_timeout5;#连接超时

fastcgi_send_timeout10; #写超时

fastcgi_read_timeout10;#读取超时

#Proxy:(针对proxy/upstreams的生效)

proxy_connect_timeout15s;#连接超时

proxy_read_timeout24s;#读超时

proxy_send_timeout10s; #写超时

}

说明:

Nginx 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。

延伸阅读:

ml

ml

ml

【PHP本身超时处理】

[ PHP-fpm ]

配置:nf

复制代码 代码如下:

?xmlversion="1.0"?

configuration

//...

Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.

EquivalenttoApacheMaxClientsdirective.

EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgi

Usedwithanypm_style.

#php-cgi的进程数量

valuename="max_children"128/value

Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminated

Shouldbeusedwhen'max_execution_time'inioptiondoesnotstopscriptexecutionforsomereason

'0s'means'off'

#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数

valuename="request_terminate_timeout"0s/value

Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile

'0s'means'off'

valuename="request_slowlog_timeout"0s/value

/configuration

说明:

在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:

valuename="request_terminate_timeout"0s/value

就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是php-fpm模式中运行时不生效的。

延伸阅读:

[ PHP ]

配置:php.ini

选项:

max_execution_time=30

或者在代码里设置:

ini_set("max_execution_time",30);

set_time_limit(30);

说明:

对当前会话生效,比如设置0一直不超时,但是如果php的safe_mode打开了,这些设置都会不生效。

效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。

【后端接口访问超时】

【HTTP访问】

一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。

如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。

[ CURL 访问HTTP]

CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。

CURL:

curl_setopt($ch,opt)可以设置一些超时的设置,主要包括:

*(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。

*(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。)

CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。

CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。

CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。

curl普通秒级超时:

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要设置一个秒的数量就可以

curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);

curl普通秒级超时使用:

curl_setopt($ch,CURLOPT_TIMEOUT,60);

curl如果需要进行毫秒超时,需要增加:

curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);

或者是:

curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒级别超时设置的

curl一个毫秒级超时的例子:

复制代码 代码如下:

?php

if(!isset($_GET['foo'])){

//Client

$ch=curl_init('');

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超时一定要设置这个

curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超时毫秒,cURL7.16.2中被加入。从PHP5.2.3起可使用

$data=curl_exec($ch);

$curl_errno=curl_errno($ch);

$curl_error=curl_error($ch);

curl_close($ch);

if($curl_errno0){

echo"cURLError($curl_errno):$curl_errorn";

}else{

echo"Datareceived:$datan";

}

}else{

//Server

sleep(10);

echo"Done.";

}

?

其他一些技巧:

1. 按照经验总结是:cURL版本=libcurl/7.21.0版本,毫秒级超时是一定生效的,切记。

2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准

[流处理方式访问HTTP]

除了curl,我们还经常自己使用fsockopen、或者是file操作函数来进行HTTP协议的处理,所以,我们对这块的超时处理也是必须的。

一般连接超时可以直接设置,但是流读取超时需要单独处理。

自己写代码处理:

复制代码 代码如下:

$tmCurrent=gettimeofday();

$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000

+($tmCurrent['usec']-$tmStart['usec']);

if($intUSGone$this-_intReadTimeoutUS){

returnfalse;

}

或者使用内置流处理函数stream_set_timeout()和stream_get_meta_data()处理:

复制代码 代码如下:

?php

//Timeoutinseconds

$timeout=5;

$fp=fsockopen("",80,$errno,$errstr,$timeout);

if($fp){

fwrite($fp,"GET/HTTP/1.0rn");

fwrite($fp,"Host:rn");

fwrite($fp,"Connection:Closernrn");

stream_set_blocking($fp,true);//重要,设置为非阻塞模式

stream_set_timeout($fp,$timeout);//设置超时

$info=stream_get_meta_data($fp);

while((!feof($fp))(!$info['timed_out'])){

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

$info=stream_get_meta_data($fp);

ob_flush;

flush();

}

if($info['timed_out']){

echo"ConnectionTimedOut!";

}else{

echo$data;

}

}

file_get_contents超时:

复制代码 代码如下:

?php

$timeout=array(

'http'=array(

'timeout'=5//设置一个超时时间,单位为秒

)

);

$ctx=stream_context_create($timeout);

$text=file_get_contents("",0,$ctx);

?

fopen超时:

复制代码 代码如下:

?php

$timeout=array(

'http'=array(

'timeout'=5//设置一个超时时间,单位为秒

)

);

$ctx=stream_context_create($timeout);

if($fp=fopen("","r",false,$ctx)){

while($c=fread($fp,8192)){

echo$c;

}

fclose($fp);

}

?

【MySQL】

php中的mysql客户端都没有设置超时的选项,mysqli和mysql都没有,但是libmysql是提供超时选项的,只是我们在php中隐藏了而已。

那么如何在PHP中使用这个操作捏,就需要我们自己定义一些MySQL操作常量,主要涉及的常量有:

MYSQL_OPT_READ_TIMEOUT=11;

MYSQL_OPT_WRITE_TIMEOUT=12;

这两个,定义以后,可以使用options设置相应的值。

不过有个注意点,mysql内部实现:

1.超时设置单位为秒,最少配置1秒

2.但mysql底层的read会重试两次,所以实际会是3秒

重试两次+ 自身一次=3倍超时时间,那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。

查看一个设置访问mysql超时的php实例:

复制代码 代码如下:

?php

//自己定义读写超时常量

if(!defined('MYSQL_OPT_READ_TIMEOUT')){

define('MYSQL_OPT_READ_TIMEOUT',11);

}

if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){

define('MYSQL_OPT_WRITE_TIMEOUT',12);

}

//设置超时

$mysqli=mysqli_init();

$mysqli-options(MYSQL_OPT_READ_TIMEOUT,3);

$mysqli-options(MYSQL_OPT_WRITE_TIMEOUT,1);

//连接数据库

$mysqli-real_connect("localhost","root","root","test");

if(mysqli_connect_errno()){

printf("Connectfailed:%s/n",mysqli_connect_error());

exit();

}

//执行查询sleep1秒不超时

printf("Hostinformation:%s/n",$mysqli-host_info);

if(!($res=$mysqli-query('selectsleep(1)'))){

echo"query1error:".$mysqli-error."/n";

}else{

echo"Query1:querysuccess/n";

}

//执行查询sleep9秒会超时

if(!($res=$mysqli-query('selectsleep(9)'))){

echo"query2error:".$mysqli-error."/n";

}else{

echo"Query2:querysuccess/n";

}

$mysqli-close();

echo"closemysqlconnection/n";

?

延伸阅读:

【Memcached】

[PHP扩展]

php_memcache客户端:

连接超时:boolMemcache::connect(string$host[,int$port[,int$timeout]])

在get和set的时候,都没有明确的超时设置参数。

libmemcached客户端:在php接口没有明显的超时参数。

说明:所以说,在PHP中访问Memcached是存在很多问题的,需要自己hack部分操作,或者是参考网上补丁。

[CC++访问Memcached]

客户端:libmemcached客户端

说明:memcache超时配置可以配置小点,比如5,10个毫秒已经够用了,超过这个时间还不如从数据库查询。

下面是一个连接和读取set数据的超时的C++示例:

复制代码 代码如下:

//创建连接超时(连接到Memcached)

memcached_st*MemCacheProxy::_create_handle()

{

memcached_st*mmc=NULL;

memcached_return_tprc;

if(_mpool!=NULL){//getfrompool

mmc=memcached_pool_pop(_mpool,false,prc);

if(mmc==NULL){

__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);

}

returnmmc;

}

memcached_st*handle=memcached_create(NULL);

if(handle==NULL){

__LOG_WARNING__("MemCacheProxy","create_handleerror");

returnNULL;

}

//设置连接/读取超时

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//参数MEMCACHED_BEHAVIOR_NO_BLOCK为1使超时配置生效,不设置超时会不生效,关键时候会悲剧的,容易引起雪崩

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//连接超时

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//读超时

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//写超时

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);

//设置一致hash

//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);

memcached_returnrc;

for(uinti=0;i_server_count;i++){

rc=memcached_server_add(handle,_ips[i],_ports[i]);

if(MEMCACHED_SUCCESS!=rc){

__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);

}

}

_mpool=memcached_pool_create(handle,_min_connect,_max_connect);

if(_mpool==NULL){

__LOG_WARNING__("MemCacheProxy","create_poolerror");

returnNULL;

}

mmc=memcached_pool_pop(_mpool,false,prc);

if(mmc==NULL){

__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);

}

//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);

returnmmc;

}

//设置一个key超时(set一个数据到memcached)

boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)

{

memcached_returnrc;

chartmp[1024];

snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);

//有个timeout值

rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);

if(MEMCACHED_SUCCESS!=rc){

returnfalse;

}

returntrue;

}

//Memcache读取数据超时(没有设置)

libmemcahed源码中接口定义:

LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);

LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);

从接口中可以看出在读取数据的时候,是没有超时设置的。

延伸阅读:

【如何实现超时】

程序中需要有超时这种功能,比如你单独访问一个后端Socket模块,Socket模块不属于我们上面描述的任何一种的时候,它的协议也是私有的,那么这个时候可能需要自己去实现一些超时处理策略,这个时候就需要一些处理代码了。

[PHP中超时实现]

一、初级:最简单的超时实现 (秒级超时)

思路很简单:链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。

phpsocket中实现原始的超时:(每次循环都当前时间去减,性能会很差,cpu占用会较高)

复制代码 代码如下:

?

$host="127.0.0.1";

$port="80";

$timeout=15;//timeoutinseconds

$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)

ordie("Unabletocreatesocketn");

socket_set_nonblock($socket) //务必设置为阻塞模式

ordie("Unabletosetnonblockonsocketn");

$time=time();

//循环的时候每次都减去相应值

while(!@socket_connect($socket,$host,$port))//如果没有连接上就一直死循环

{

$err=socket_last_error($socket);

if($err==115||$err==114)

{

if((time()-$time)=$timeout)//每次都需要去判断一下是否超时了

{

socket_close($socket);

die("Connectiontimedout.n");

}

sleep(1);

continue;

}

die(socket_strerror($err)."n");

}

socket_set_block($this-socket)//还原阻塞模式

ordie("Unabletosetblockonsocketn");

?

二、升级:使用PHP自带异步IO去实现(毫秒级超时)

说明:

异步IO:异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步IO将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。

多路复用:复用模型是对多个IO操作进行检测,返回可操作集合,这样就可以对其进行操作了。这样就避免了阻塞IO不能随时处理各个IO和非阻塞占用系统资源的确定。

使用socket_select()实现超时

socket_select(...,floor($timeout),ceil($timeout*1000000));

select的特点:能够设置到微秒级别的超时!

使用socket_select()的超时代码(需要了解一些异步IO编程的知识去理解)

复制代码 代码如下:

编程 调用类 编程#

?php

$server=newServer;

$client=newClient;

for(;;){

foreach($select-can_read(0)as$socket){

if($socket==$client-socket){

//NewClientSocket

$select-add(socket_accept($client-socket));

}

else{

//there'ssomethingtoreadon$socket

}

}

}

?

编程 异步多路复用IO 超时连接处理类 编程

?php

classselect{

var$sockets;

functionselect($sockets){

$this-sockets=array();

foreach($socketsas$socket){

$this-add($socket);

}

}

functionadd($add_socket){

array_push($this-sockets,$add_socket);

}

functionremove($remove_socket){

$sockets=array();

foreach($this-socketsas$socket){

if($remove_socket!=$socket)

$sockets[]=$socket;

}

$this-sockets=$sockets;

}

functioncan_read($timeout){

$read=$this-sockets;

socket_select($read,$write=NULL,$except=NULL,$timeout);

return$read;

}

functioncan_write($timeout){

$write=$this-sockets;

socket_select($read=NULL,$write,$except=NULL,$timeout);

return$write;

}

}

?

[CC++中超时实现]

一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库(libevent,libev)也能实现。

一、使用alarm中用信号实现超时 (秒级超时)

说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号(也可使用select实现)

用alarym秒级实现 connect设置超时代码示例:

复制代码 代码如下:

//信号处理函数

staticvoidconnect_alarm(intsigno)

{

debug_printf("SignalHandler");

return;

}

//alarm超时连接实现

staticvoidconn_alarm()

{

Sigfunc*sigfunc;//现有信号处理函数

sigfunc=signal(SIGALRM,connect_alarm);//建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数

inttimeout=5;

//设置闹钟

if(alarm(timeout)!=0){

//...闹钟已经设置处理

}

//进行连接操作

if(connect(m_Socket,(structsockaddr*)addr,sizeof(addr))0){

if(errno==EINTR){//如果错误号设置为EINTR,说明超时中断了

debug_printf("Timeout");

php程序怎么长时间执行?

PHP不能长时间执行的原因:

由于PHP主要用于网页开发,为了避免长时间执行的网页占用太多的网络资源,PHP提供了限制PHP程序执行时间的方法,在php.ini 中的 max_execution_time 变量指定程序最大执行时间,默认是30秒,PHP程序执行超过这个时间后将被系统强制结束。

使PHP长时间执行的办法:

如果你的PHP系统不是为了网站开发而安装的,可以在PHP.INI文件里面修改这个参数的值。如果只是个别程序希望执行较长的时间,不想修改整个系统的配置,或者没有权限修改系统配置,可以在PHP程序里面适用本程序的参数值,语句示例:

//设置时间限制为2分钟

set_time_limit(120);

//设置时间限制为0,允许无限期执行

set_time_limit(0);

PHP中session_cache_limiter() 是什么意思啊

session_cache_limiter,它是session在客户端的缓存方式,有nocache,private,private_no_expire,publice主这几种。cache是属于浏览器的特性,它决定你浏览网页的缓存方式,没有缓存的情况会使你按浏览的“后退”键时提示要你更新连接,之前的内容就没有了,比如你填入的表单信息,都被丢失。

通过header("Cache-Control: no-store, no-cache, must-revalidate");函数也一样达到效果。然而,session的处理机制里,就强制自动调用了header函数设置cache,这个置就由php.ini中的缺省值session.cache_limiter值或由session_cache_limiter函数设定所取代。session_cache_limiter内的几个参数意义是:

nocache:当然是不缓存(比如:表单信息被清除),但公共变量可以缓存

private:私有方式缓存(比如:表单信息被保留,但在生存期内有效)

private_no_cache:私有方式但不过期(表单信息被保留)

publice:公有方式,(表单信息也被保留)它们之间的具体区别,我还不是太清楚,可以区别的是除nocache外其它的都可以缓存,private方式还受生存期影响,这个生存期应该是由session.cache_expire给定,它在php.ini中设置或session_cache_expire函数设置,缺省是180分钟。

php缺省参数,函数缺省参数

2023-01-04
c语言缺省扩展,c语言允许缺省定义

2023-01-06
php函数中缺少参数,php函数的参数不可以设定默认值

2022-11-20
c语言缺少函数,c语言缺省函数

2022-11-22
php教程笔记复习1(细说php读书笔记)

2022-11-10
php获取js里的参数,php 获取命令行参数

本文目录一览: 1、怎么让PHP获取到JS中参数 2、php调用js代码中的参数 3、php里怎样使用js里面获取的参数 4、PHP怎么读取JS文件里的数据 5、js变量在PHP中怎么获取该变量 怎么

2023-12-08
学习php随笔,PHP笔记

2022-11-25
php函数参数引用,php函数默认参数

2023-01-07
php技术参数(php参数类型)

2022-11-08
函数php参数为0(php函数默认值)

2022-11-12
php折腾记(php笔记)

2022-11-15
php和jsp的缺点,php和jsp的优缺点

本文目录一览: 1、比较ASP PHP 和JSP的优缺点 2、请问下JSP与PHP各有什么优缺点? 3、PHP和JSP对比? 4、北大青鸟设计培训:Java和php的优、劣势及前景分析? 5、关于we

2023-12-08
php按值传递参数(php 函数作为参数)

2022-11-10
php最佳实践之数据库(php数据库函数)

2022-11-14
PHP中的column()函数

2023-05-11
php教程第034讲(php课堂笔记)

2022-11-11
php接口统一设置参数验证,php函数默认参数

2023-01-04
php时间戳函数,php 时间戳是几位数

2022-12-01
php笔试题2019,php笔试题不会写

2022-11-27
php第三节笔记,php读书笔记

2022-12-02