導航:首頁 > 編程語言 > 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相關的資料

熱點內容
php論壇實訓報告 瀏覽:403
java日期字元串轉換成日期 瀏覽:135
linuxsftp連接 瀏覽:934
光伏日發電量演算法 瀏覽:125
小肚皮app怎麼才有vip 瀏覽:616
php全形轉換半形 瀏覽:927
java字元序列 瀏覽:539
杭州編譯分布式存儲區塊鏈 瀏覽:575
材料壓縮曲線 瀏覽:247
linux命令排序 瀏覽:151
手機熱點加密為啥連接不上電腦 瀏覽:979
編譯器合並計算 瀏覽:959
android音頻曲線 瀏覽:343
linuxftp自動登錄 瀏覽:802
運行編譯後網頁 瀏覽:70
閱讀app怎麼使用 瀏覽:319
centos防火牆命令 瀏覽:432
命令行變更 瀏覽:332
linux設備和驅動 瀏覽:207
加密貨幣騙局破案 瀏覽:345