导航:首页 > 编程语言 > phpsocketfeof

phpsocketfeof

发布时间:2023-04-07 06:53:19

php模拟socket一次连接,多次发送数据的如何实现代码

";
}
fclose($conn);
}
function WriteData($conn,$host,$data)
{
$header = "POST /test.php HTTP/1.1\r\n";
$header.= "Host : {$host}\r\n";
$header.= "Content-type: application/x-www-form-urlencoded\r\n";
$header.= "Content-Length:".strlen($data)."\r\n";
//Keep-Alive是关键
$header.= "Connection: Keep-Alive\r\n\r\n";
$header.= "{$data}\r\n\r\n";
fwrite($conn,$header);
//取结果
//$result = '';
//while(!feof($conn))
//{
// $result .= fgets($conn,128);
//}
//return $result;
}
Post('127.0.0.1',80);
?>

Ⅱ php 中 fsockopen() 函数是什么意思 怎么用

目前这个函数提供二个 Socket 资料流界面,分别为 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。当在 Internet 情形下使用时,参数 hostname 及 port 分别代表网址及端口号。在 UNIX 情形可做 IPC,hostname 参数表示到 socket 的路径,port 配置为 0。可省略的 timeout 选项表示多久没有连上就中断。在使用本函数之后会返回文件指针,供文件函数使用,包括 fgets()、fgetss()、fputs()、fclose() 与 feof()。参数 errno 及 errstr 也是可省略的,主要当做错误处理使用。使用本函数,会使用搁置模式 (blocking mode) 处理,可用 set_socket_blocking() 转换成无搁置模式。 给你个例子 模拟成 HTTP 连接 <?php $fp = fsockopen("php.wilson.gs", 80, &$errno, &$errstr, 10); if(!$fp) { echo "$errstr ($errno)<br>\n"; } else { fputs($fp,"GET / HTTP/1.0\nHost: php.wilson.gs\n\n"); while(!feof($fp)) { echo fgets($fp,128); } fclose($fp); } ?>

满意请采纳

Ⅲ php中的feof()函数是什么

feof() 函数兄颂带检测是否已到达文件末尾 (eof)。
如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错樱颂误(包括 socket 超时),其它情况则返回 FALSE。
feof(file); file 必需。规定要检查的打开文件。
例子
<?php
$file = fopen("test.txt", "r");

//输出文本中所有的行,直到文件结束为止。
while(! feof($file))
{
echo fgets($file). "<br />";
}

fclose($file);
?>羡芦

Ⅳ 如何用PHP定义socket的包头

$info["path"] = '/index.html';
$info["host"] = '127.0.0.1';
$info["port"]=80;
$data_string= "name=peter";

这个是发送请求,重新定义了http头部,具体信息在函数里修改就可以了。

echo url_post($info, $data_string);

function url_post($info, $data_string){
$request = '';
$request.="POST ".$info["path"]." HTTP/1.1\n";
$request.="Host: ".$info["host"]."\n";
//$request.="Referer: $referrer\n";
//$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="\n";
$request.=$data_string."\n";

//echo $request;

$fp = fsockopen($info["host"],$info["port"]);
fputs($fp, $request);
$result = '';
while(!feof($fp)) {
$result .= fgets($fp, 128);
}
fclose($fp);

return $result;
}

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

【Web服务器超时处理】

[ Apache ]
一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时操作。
目前apachefastcgiphp-fpm模式下有三个超时设置:
fastcgi超时设置:
修改的fastcgi连接配置,类似如下:

复制代码 代码如下:

<IfMolemod_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-
</IfMole>

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

复制代码 代码如下:

<IfMolemod_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-
</IfMole>

如果超时会返回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>
//...
.
.
EquivalenttoPHP_FCGI_.fcgi
Usedwithanypm_style.
#php-cgi的进程数量
<valuename="max_children">128</value>
Thetimeout(inseconds)
Shouldbeusedwhen'max_execution_time'
'0s'means'off'
#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数
<valuename="request_terminate_timeout">0s</value>
Thetimeout(inseconds).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_errno>0){
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部分操作,或者是参考网上补丁。
[C&C++访问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;
}
}
?>

[C&C++中超时实现]
一般在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入门:php学习必看的入门视频教程,学完能够做一些基础性的web开发

php提高:php开发高级教程及经验总结,包含一些知识点的归纳总结,以及开发经验总结

php实战:php开发实战视频教程,看完你就能开发大型的web项目啦!

学习路线

一、 网上某些错误的学习路线图网上有些错误的学习路线图,让学完HTML、CSS后立马去学Javascript和jQuery等,这种课程简直是对牛弹琴。你特么的怎么不去搞个前端工程师培训或者是吹牛逼的全栈工程师培训呀。这种错误的路线图的问题在于将重心未放在PHP方向,而放在了前端方向。将面向对象,业务思想、SQL转化等PHP关注的重心没有放置在之前而放置在之后了。PHP的重心还是要放在业务处理上。

二、 前期加快入门前期的时候要加快入门的进度,学一些HTML和Css能基本写出网页后,就快速进入到PHP阶段。因为大家是自学的PHP,学了半天还没搞到PHP的话,会放松对学习的热情,从而造成自学效果下降。学完HTML和Css不要学Js,立马进入到环境的搭建上来。

三、 关于开发 环境很多人在这儿走弯路,喜欢找不到同教程看环境搭建。我们在公司里面开发的时候,真正的是使用的Linux环境进行开发和线上代码运行的。在学习的过程中,我建议:快、快、快。少纠结、代码能跑就行。此处,推荐使用XAMPP、AppServ、PHPStudy、WampServer等工具快速安装完成,开始自己的第一段

<?php
phpinfo();

四、 基本语法环境搭建完,开始要学习的东西有以下一些东西了:变量、数据类型、注释、常量、if…else、swith…case、while、do..while、for、运算符、数组、函数、常用函数;这些过程当中,很多小白容易纠结为啥啥都写不出来呢。此外,全是些基本语法,一定要记住,多写多记多背。在心理上觉得啥都写不出来是很正常的。

五、 面向过程使用阶段在这一阶段就能够写出东西来了,学完MySQL数据库后立马开始学习PHP连接数据库吧,学习完成后写个留言本、分页、再学个cookie和session实现用户登陆、注册。学个GD后开始实现个验证码吧。最后在这个阶段你可以写一个论坛、贴吧或者商城出来。

六、 面向对象和MVC在这个阶段不要再看PHP5的视频了,最好看PHP7以后的视频,特别是新的一些标准,例如:composer、PSR、面向对象的设计模式等。你可以看一些千锋PHP最新的视频,这些技术点全都讲到了。这一块学习顺序:面向对象基本语法;写几个常用类;组合MVC学习设计模式学习PSR

七、 深入学学前端PHP学好了,前端课程学起来跟玩似的了。因为你已经有了一门语言的基础了。所以,学习一些JS,再学一些jQuery,bootstrap够你用了。

八、 深入ThinkPHP5.0或者Laravel深入学习一个或者两个框架,然后结合前端的知识,写二个以上的项 目出来吧。你可以写个多品类的商城、写一个OA系统等。

九、 学习Linux服务器学习Linux服务器的主要了解多服务器的部署,了解软件安装,特别是LAMP和LNMP的环境搭建。将对应的代码搭建到自己部署的服务器上去。最后买一个域名和阿里云服务器,真正的将代码部署到云服务器上去,走一次上线流程,用一下git管理一下代码会更棒。

十、 深入大并发架构的学习你非常有必要学习一下大并发架构,学一些NoSQL技术、Swoole技术、keepalived技术等多项不同的技术。让自己全面了解服务器集群下代码如何运行的更加高效。并且全面的了解一下PHP的socket、进程、线程、协程等技术,对你的代码的技术提升是很有帮助的。建议这个时候使用Redis、RockMQ写一个大并发的、多服务器的秒杀出来。这一块国内都有很多视频,视频不要再看PHP5的视频了,你可以多看看PHP7的视频。现在学习PHP已经不再是单纯的学习PHP了,到后期更多的是学服务器集群,大并发处理,按照这个路线图一点一点往前走,有问题可以在评论下面咱们相互交流。

学习建议

我们要有一个循序渐进的学习过程,这里先把学习PHP的过程做一下概括,这和很多学习PHP的爱好者是不谋而合的:

(1) 熟悉HTML/CSS/JS、、网页基本元素,完成阶段可自行制作简单的网页,对元素属性相对熟悉

(2) 理解动态语言的概念和运做机制,熟悉基本的PHP语法

(3) 学习如何将PHP与HTML结合起来,完成简单的动态页面

(4) 接触学习MySQL,开始设计数据库

(5) 不断巩固PHP语法,熟悉大部分的PHP常用函数,理解面向对象编程,MySQL优化,以及一些模板和框架

(6) 最终完成一个功能齐全的动态站点

新手不要看到上面的概括就以为PHP学习是很简单的,编程是需要你认真的思考和不断的实践。 下面具体解释一下PHP的学习线路。 首先,任何网站全都是由网页组成的,也就是说想完成一个网站,必须先学会做网页,掌握静态网页的制作技术是学习开发网站的先决条件。 因此我们要学习HTML,为今后制作网站打下基础。 学习HTML应该边学边做,HTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,才能深刻记忆,一味的看书是不行的

假设你已经可以完成一个静态页面了,那么就该开始了解动态语言,刚一接触动态语言,可能很多人都会拥有很多不解,代码不是作为直接输出的,而是要经过处理的,HTML是经过HTML解析器,而PHP也要通过PHP解析器,跟学习HTML一样的道理,想让任何的解析器工作,就必须使用它专用的语法结构

学习PHP,你应该感到幸运,因为如果你学过其他语言,你就会发现PHP还是相对简单的,这一阶段,你要搞清楚HTML和PHP的概念,你现在完全可以让PHP给你算算一加一、、于几,然后在浏览器输出。 不要觉得幼稚,这虽然是很小的一段代码,但是对于你的编程之路,可是迈出了一大步。 不过现在,你还是一个菜鸟

接下来就要学习数据库了,MySQL可以说是PHP的黄金搭档,我们要征服这个数据库,在你理解了数据库的概念之后,就要尝试通过PHP来连接数据库,进而会用PHP成功的插入,删除和更新数据

这个时候,你可能会处于这种状态:你会HTML吗?会,我能编好几个表格排板的网页呢!你会PHP吗?会,我会把一加一的运算写在函数里,然后调用!你会MySQL吗?会,我可以把数据库里的数据插入删除啦!

那接下来该做什么呢?尝试着做个小的留言本吧,这同样是新手面临的一道关卡。 花了一段时间,你终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。 但是,你可能会看人家这个编论坛,那个开发CMS,我什么时候可以写一个呢?不要急,再巩固一下知识,熟悉了PHP和MySQL开发的要领后,再回头看你写的那个留言本,你也许会怀疑那真的是你写的吗?这个时候,你可以完善一下你写的留言本。 留言本应该加入注册以及分页的功能,可以的话,UI也可以加强

这就算学会了吗?NO,NO,NO,还早呢,你到现在还没碰过OOP呢吧?那模板和框架呢?还要继续学习呀!PHP框架提供了一个用以构建web应用的基本框架,从而简化了用PHP编写web应用程序的流程。 可以节省开发时间、、有助于建立更稳定的应用。 所以说,PHP框架是一个可以用来节省时间并强化自己代码的工具。 当你第一次选择PHP框架时,建议多尝试几个,每个框架都有自己的长处和短处,例如Zend框架由于多样的功能、、并且有一个广泛的支持系统,流行了很长时间。 而CakePHP是一个晚于Zend的PHP框架,相应的支持系统也比较少,但是更为方便和易于使用

了解了面向对象和框架后,你应该接触一下XML了,总而言之,你绝对不会发现你全部都学会了,学无止境!学东西,永远不要妄想有速成这一说,技巧再多,但是缺少努力,那也是白搭。 有一点可以保证,就是你学会了PHP,那么再学其它语言,肯定速成,反过来也一样,如果你之前学过其它的语言,那么学PHP肯定快

多借鉴别人成功的代码,绝对是有益无害,所以要多看那些经过千锤百炼凝出来的经典代码,是进步的最好方法。 另外,要强调的是,学习一项技术过程中可能会遇到困难,可能会迷茫,你也许学了一半的PHP,又开始打C#的主意,或者有人说Java很好,这个时候你绝对不能动摇,要坚持到底,彻底学会。 祝你顺利学成PHP,开发自己想要的网站

最后,分享10条PHP性能优化的小技巧,帮助你更好的用PHP开发:

1、、foreach效率更高,尽量用foreach代替while和for循环

2、、循环内部不要声明变量,尤其是对象这样的变量

3、、在多重嵌套循环中,如有可能,应当将最长的循环放在内层,最短循环放在外层,从而减少cpu跨循环层的次数,优化程序性能

4、、用单引号替代双引号引用字符串以实现PHP性能优化

5、、用i+=1代替i=i+1。 符合c/c++的习惯,效率还高

6、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作,达到PHP性能优化的目的

7、、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的

8、、尽可能的使用PHP内部函数

9、、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式

10、feof、fgets、fopen、在可以用file_get_contents替代file、系列方法的情况下,尽量用 file_get_contents,因为它的效率高得多。 但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题

Ⅶ php本地用虚拟机怎么模拟socket

利用socket发送HTTP请求。

Socket的英文原义是“孔”或“插座”。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。如此看来,其实利用socket操作远程文件和读写本地的文件一样容易,把本地文件看成通过硬件传输,远程文件通过网线传输就行了。

因而可以将发送请求的考虑成建立连接->打开socket接口(fsockopen())->写入请求(fwrite())->读出响应(fread()->关闭文件(fclose())。话不多说,直接上代码:

conn($url);
$this->setHeader('Host:'.$this->url['host']);
}

//此方法负责写请求行
protectedfunctionsetLine($method){
$this->line[0]=$method.''.$this->url['path'].'?'.$this->url['query'].''.历乎$this->version;
}

//此方法负责写头信息
publicfunctionsetHeader($headerline){
$this->header[]=$headerline;
}

//此方法负责写主体信息
protectedfunctionsetBody($body){
$this->body[]=http_build_query($body);
}


//连接url
publicfunctionconn($url){
$this->url=parse_url($url);
//判断端口
if(!isset($this->url['port'])){
$this->url['port']=80;
}

//判断query
if(!isset($this->url['query'])){
$this->url['query']='';
}

$this->fh=fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3);
}

//构造get请求的肢配悉数据
publicfunctionget(){
$this->setLine('GET');
$this->request();
return$this->response;
}

//构造post查询的数据
publicfunctionpost($body=array()){
$this->setLine('POST');

//设计content-type
$this->setHeader('Content-type:application/x-www-form-urlencoded');

//设计主体信息,比GET不一样的地方
$this->setBody($body);


//计算content-length
$this->setHeader('Content-length:'.strlen($this->body[0]));

$this->request();

return$this->response;
}

//真正请求
publicfunctionrequest(){
//把请求行,头信息,实体信息放在一个数组里,便于拼接
$req=array_merge($this->line,$this->header,array(''),$this->body,array(''));
//print_r($req);

$req=implode(self::CRLF,$req);
//echo$req;exit;

fwrite($this->fh,$req);

while(!feof($this->fh)){
$this->response.=fread($this->fh,1024);
}

$this->close();//关闭连接
}


//关闭连接
publicfunctionclose(){
卖缺fclose($this->fh);
}

}

Ⅷ PHP和SOCKET和HTTP Connection: keep-alive疑惑 为什么

这个问题,你只要了解了 Keep-Alive 的用户,就不会迷惑了(详见HTTP协议)

Keep-Alive 的意义是保持客户端 <-> 的连接,这姿汪模样在下次请求时就不必重建HTTP连接。

没有 Keep-Alive 的时候,一个请迹缓求可能0.1秒;

用了 Keep-Alive 之后陵握,一个请求可能保持5秒,那么自然你感受到的就是“慢”

Ⅸ PHP 的文件指针函数 feof()的问题

rewind($fopen)这个是把指针定到开头了(等价于fseek(stream, 0, SEEK_SET)),但是你紧接着又fseek($fopen,0,SEEK_END),把指针定到结尾,(这两个操作连着的话无意义吧),定到结尾了。

你这个问题一开始看fseek还是有点乱的,你就想成是把光标移动到宏扮蚂结尾的!之后,但是又在eof之前。如果你fseek($fopen,0,SEEK_END)后,再fgetc($fopen);一次,再var_mp($feof($fopen)) 就是true了。

另外你这里有个错误,SEEK_END需要缺和配合负数偏移使用的,正数右移,负数左移,因为已经是结尾了,右移无意义了。则你fseek($fopen,345,SEEK_END) 这里是错的。
还有fseek如果执行失败(比如offset超过文件自身大小蔽埋),则不改变stream指向的位置的。

Ⅹ 如何查看php进程请求的socket详情

PHP使用socket发送HTTP请求的方法,具体如下:
socket方式:
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>20,"usec"=>0));socket_connect($socket,'www..com',80);//里面的换行代表 注意拷贝的代码后面可能有空格$http=<<<eof
GET/HTTP/1.0
Accept:*/*
User-Agent:Lowell-Agent
Host:www..com
Connection:Close
eof;
socket_write($socket,$http,strlen($http));while($str=socket_read($socket,1024))
{
echo$str;
}
socket_close($socket);
fsockopen方式:
$fp=fsockopen("www..com",80,$errno,$errstr,30);if(!$fp){
echo"$errstr($errno)<br/> ";
}else{
$out="GET/HTTP/1.1 ";
$out.="Host:www..com ";
$out.="Connection:Close ";
fwrite($fp,$http);
while(!feof($fp)){
echofgets($fp,128);
}
fclose($fp);
}
原始socket方式:
$fp=stream_socket_client("tcp://www..com:80",$errno,$errstr,30);if(!$fp){
echo"$errstr($errno)<br/> ";
}else{
$http=<<<eof
GET/HTTP/1.0
Accept:*/*
User-Agent:Lowell-Agent
Host:www..com
Connection:Close
eof;
fwrite($fp,$http);
while(!feof($fp)){
echofgets($fp,1024);
}
fclose($fp);
}
stream方式(get):
$http=<<<eof
Host:www..com
User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64;rv:27.0)Gecko/20100101Firefox/27.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Cookie:BAIDUID=:FG=1;BDUSS=lF--FPnkfhTU;BAIDUPSID=;BD_UPN=13314352;BD_HOME=1;H_PS_PSSID=10047_1435_10874_10212_10501_10496_10753_10796_10219_10355_10666_10597_10095_10658_10442_10700_10460_10360_10618;sug=3;sugstore=0;ORIGIN=2;bdime=0Connection:keep-alive
Cache-Control:max-age=0
eof;
$hdrs=array(
'http'=>array(
'header'=>$http,
'timeout'=>1,//超时秒
'method'=>'GET',//默认方式
'protocol_version'=>'1.1',//默认为1.0),
);
//参数格式参考http://php.net/manual/zh/context.http.php//curl方式的格式可以参考;http://php.net/manual/zh/context.curl.php$context=stream_context_create($hdrs);
echofile_get_contents('http://www..com',0,$context);stream方式post:
$postdata=http_build_query(array('act'=>'save','id'=>387171));$http=<<<eof
Host:www..com
User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64;rv:27.0)Gecko/20100101Firefox/27.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Content-Type:application/x-www-form-urlencoded;charset=UTF-8Cookie:BAIDUID=:FG=1;BDUSS=lF--FPnkfhTU;BAIDUPSID=;BD_UPN=13314352;BD_HOME=1;H_PS_PSSID=10047_1435_10874_10212_10501_10496_10753_10796_10219_10355_10666_10597_10095_10658_10442_10700_10460_10360_10618;sug=3;sugstore=0;ORIGIN=2;bdime=0Connection:keep-alive
Cache-Control:max-age=0
eof;
#注意post方式需要增加Content-Type
$hdrs=array(
'http'=>array(
'header'=>$http,
'timeout'=>1,//超时秒
'method'=>'POST',
'content'=>$postdata,
'protocol_version'=>'1.1',//默认为1.0),
);
//参数格式参考http://php.net/manual/zh/context.http.php//curl方式的格式可以参考;http://php.net/manual/zh/context.curl.php$context=stream_context_create($hdrs);
echofile_get_contents('http://test.cm/song.php',0,$context);

阅读全文

与phpsocketfeof相关的资料

热点内容
linuxftp自动登录 浏览:802
运行编译后网页 浏览:70
阅读app怎么使用 浏览:319
centos防火墙命令 浏览:432
命令行变更 浏览:332
linux设备和驱动 浏览:207
加密货币骗局破案 浏览:345
cc特征码加密 浏览:775
清空dns缓存命令 浏览:295
文件夹单击右键一直转圈 浏览:820
天天玩乐园是哪个app 浏览:395
单片机数码管动态显示效果图 浏览:874
备用dns服务器地址可以调吗 浏览:267
ad剑魔和app哪个好 浏览:865
java的undefined 浏览:813
列表的合并与排序python代码 浏览:324
编译原理英文版pdf下载 浏览:951
c单片机pdf 浏览:827
adb下载命令 浏览:126
安卓怎么打开pdf 浏览:108