Ⅰ 求高手把這段php代碼翻譯成C#
$chunk_size = (int)hexdec(fgets( $socket_fd, 4096 ) );
while(!feof($socket_fd) && $chunk_size > 0) {
$bodyContent .= fread( $socket_fd, $chunk_size );
fread( $socket_fd, 2 ); // skip \r\n
$chunk_size = (int)hexdec(fgets( $socket_fd, 4096 ) );
}
Ⅱ php怎麼高效獲取遠程圖片尺寸
/**
*獲取遠程圖片的寬高和體積大小
*
*@paramstring$url遠程圖片的鏈接
*@paramstring$type獲取遠程圖片資源的方式,默認為curl可選fread
*@paramboolean$isGetFilesize是否獲取遠程圖片的體積大小,默認false不獲取,設置為true時$type將強制為fread
*@returnfalse|array
*/
functionmyGetImageSize($url,$type='curl',$isGetFilesize=false)
{
//若需要獲取圖片體積大小則默認使用fread方式
$type=$isGetFilesize?'fread':$type;
if($type=='fread'){
//或者使用socket二進制方式讀取,需要獲取圖片體積大小最好使用此方法
$handle=fopen($url,'rb');
if(!$handle)returnfalse;
//只取頭部固定長度168位元組數據
$dataBlock=fread($handle,168);
}
else{
//據說CURL能緩存DNS效率比socket高
$ch=curl_init($url);
//超時設置
curl_setopt($ch,CURLOPT_TIMEOUT,5);
//取前面168個字元通過四張測試圖讀取寬高結果都沒有問題,若獲取不到數據可適當加大數值
curl_setopt($ch,CURLOPT_RANGE,'0-167');
//跟蹤301跳轉
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
//返回結果
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$dataBlock=curl_exec($ch);
curl_close($ch);
if(!$dataBlock)returnfalse;
}
//將讀取的圖片信息轉化為圖片路徑並獲取圖片信息,經測試,這里的轉化設置jpeg對獲取png,gif的信息沒有影響,無須分別設置
//有些圖片雖然可以在瀏覽器查看但實際已被損壞可能無法解析信息
$size=getimagesize('data://image/jpeg;base64,'.base64_encode($dataBlock));
if(empty($size)){
returnfalse;
}
$result['width']=$size[0];
$result['height']=$size[1];
//是否獲取圖片體積大小
if($isGetFilesize){
//獲取文件數據流信息
$meta=stream_get_meta_data($handle);
//nginx的信息保存在headers里,apache則直接在wrapper_data
$dataInfo=isset($meta['wrapper_data']['headers'])?$meta['wrapper_data']['headers']:$meta['wrapper_data'];
foreach($dataInfoas$va){
if(preg_match('/length/iU',$va)){
$ts=explode(':',$va);
$result['size']=trim(array_pop($ts));
break;
}
}
}
if($type=='fread')fclose($handle);
return$result;
}
//測試的圖片鏈接
echo'<pre>';
$result=myGetImageSize('http://s6.mogujie.cn/b7/bao/120630/2kpa6_kqywusdel5bfqrlwgfjeg5sckzsew_345x483.jpg_225x999.jpg','curl');
print_r($result);
echo'<hr/>';
$result=myGetImageSize('http://s5.mogujie.cn/b7/bao/120629/6d3or_kqytasdel5bgevsugfjeg5sckzsew_801x1193.jpg','fread');
print_r($result);
echo'<hr/>';
$result=myGetImageSize('https://gss0..com/7LsWdDW5_xN3otqbppnN2DJv/zhengmingjiang/pic/item/1c5f338c6d22d797503d92f9.jpg','fread',true);
print_r($result);
echo'<hr/>';
$result=myGetImageSize('http://www.vegandocumentary.com/wp-content/uploads/2009/01/.png','curl',true);
print_r($result);
echo'<hr/>';
$result=myGetImageSize('http://jiaoyou.ai9475.com/front/templates/jiaoyou/styles/default/image/ad_pic_1.gif','fread');
print_r($result);
Ⅲ 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);
}
}