HTTP Status 415

2015年1月8日 沒有評論

使用php curl的方式調用對方提供的接口,收到了如下錯誤提示

HTTP Status 415

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

Curl 的代碼片段如下:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));

$data = curl_exec($ch);
curl_close($ch);

多次檢查curl設置已經接口的說明沒有發現問題。對方的服務器使用的是Tomcat 7, 一度懷疑是對方web配置有誤,后來仔細研究文檔,其中提到Response是jason格式文檔,而上述curl中沒有指定Request Header 信息, 所以嘗試加入一個header, 結果問題解決。 代碼如下:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8"));
分類: PHP 標簽: ,

centos 64位編譯php出現Cannot find OpenSSL’s libraries

2014年3月10日 沒有評論

在一臺Centos6.4 64位編譯安裝php時候,出現Cannot find OpenSSL’s libraries,前提是已經確認通過yum 安裝過OpenSSL庫,在網上搜索,基本上得到的結果是安裝OpenSSL庫,對我的問題無濟于事。最后在一個論壇發現,因為是64位系統,OpenSSL庫安裝在/usr/lib64/,但在安裝php時,它還是去/usr/lib/ 下查找該庫,故報上述錯誤。清楚了問題所在,解決辦法就是做一個軟鏈接如下:

ln -s /usr/lib64/libssl.so /usr/lib/
分類: PHP 標簽:

php-fpm 開啟 關閉 重啟

2014年2月12日 沒有評論

自php5.3.3開始,php源碼中包含了php-fpm,不需要單獨通過補丁的方式安裝php-fpm,在源碼安裝的時候直接 configure 中增加參數 –enable-fpm 即可。

所以啟動、關閉和重新加載的方式和以前不同,需要使用信號控制:

php-fpm master 進程可以理解一下信號:

SIGINT, SIGTERM 立刻終止
SIGQUIT 平滑終止
SIGUSR1 重新打開日志文件
SIGUSR2 平滑重載所有worker進程并重新載入配置和二進制模塊

例如:關閉php-fpm

kill -SIGINT `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm 重啟

kill -SIGUSR2 `cat /usr/local/php/var/run/php-fpm.pid`

注意:/usr/local/php/var/run/php-fpm.pid 指存儲master進程號的文件,這里是默認地址,在配置中可以修改,另外可以使用ps命令找到master的進程號,然后使用 kill 信號 進程號 的方式。

分類: PHP 標簽:

PHP include 非PHP文件

2013年8月23日 沒有評論

include和require的用途是包含并運行指定的文件。在官方手冊沒有說明被包含的文件類型,那么PHP到底能不能include一個非PHP文件呢?實踐出真理,寫一個簡單文件PHP文件include一個js文件,執行后沒有報錯或警告信息,同時看到被包含js的文件的內容被打印出來。因此得出結論:include 目標文件可以是任意類型

現在再回頭看include的官方文檔,其中有這么一段話:“當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式并進入 HTML 模式,到文件結尾處恢復。由于此原因,目標文件中需要作為 PHP 代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。” 注意其中提到“HTML模式,PHP代碼必須包括在有效的PHP標記符中”,仔細體會其含義,它其實隱式的說明了include可以是任意類型的文件。

另外在4.3.0以后,include 目標文件還可以是一個url,當然前提是需要在配置中設置 allow_url_include 為 on。

分類: PHP 標簽:

php set_time_limit

2013年8月14日 沒有評論

一個php腳本通過crontab每5分鐘執行一次,考慮到腳本執行時間會超過5分鐘,特意用set_time_limit(290)來控制腳本在290秒退出。某天突然發現后臺有多個該腳本的進程在執行,也就是說set_time_limit(290)沒有起作用。為了證明,特意使用如下代碼測試。

set_time_limit(5);

for ($i = 0; $i < 100; $i++) {
    echo date('Y-m-d H:i:s') . "\n";
    sleep(1);
}

無論是在web還是CLI下,上述腳本并沒有在5秒鐘后退出。后來加上ini_set(‘max_execution_time’, 5)測試,結果一樣。那是不是說明set_time_limit函數根本就沒有用呢?其實不然,在 http://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli 這里找到根源所在,其實是上面的寫法有問題,例如使用下述代碼:

set_time_limit(5);

for (;;) {
}

執行后,大概5秒鐘就可以看到”Fatal error: Maximum execution time of 5 seconds exceeded in”類似這樣的錯誤提示。說明set_time_limit是起作用的。現在在去看看官方文檔(http://www.php.net/manual/en/function.set-time-limit.php)上關于此函數的說明,在Note中寫到:

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

注意:sleep函數暫停的時間也是不計入腳本的執行時間的。所以也是第一個測試失敗的原因。

分類: PHP 標簽:

php 獲取flash的尺寸信息

2013年8月14日 沒有評論

如果你還想著通過解析swf文件頭信息來獲取flash文件的尺寸信息,那真的有點走遠了。因為從PHP 4開始已經內置getimagesize函數來做這個事。其功能測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類型和一個可以用于普通 HTML 文件中 IMG 標記中的 height/width 文本字符串。而且從PHP 4.0.5起還支持參數是一個url。例如:

print_r(getimagesize('http://www.google.com.hk/images/srpr/logo4w.png'));
輸出的結果為:
Array
(
    [0] => 550
    [1] => 190
    [2] => 3
    [3] => width="550" height="190"
    [bits] => 8
    [mime] => image/png
)
分類: PHP 標簽:

php 判斷常量、變量和函數是否存在

2013年8月13日 沒有評論

對應標題所提的問題,php內部自帶了函數提供檢測。

常量檢測使用defined,定義常量則是define。注意待檢測的常量需要使用引號(單雙均可),如:

if (defined('CONST_NAME')) {
    //do something	
}

變量檢測則是使用isset,注意變量未聲明或聲明時賦值為NULL,isset均返回FALSE,如:

if (isset($var_name)) {
    //do something
}

函數檢測用function_exists,注意待檢測的函數名也需要使用引號,如:

if (function_exists('fun_name')) {
	fun_name();
}
分類: PHP 標簽:

php 獲取月第一天和最后一天

2013年8月11日 沒有評論

借助于date和strtotime函數,可以輕松的獲取本月、下月以及上月的第一天和最后一天,下面分別給出其實現。其中函數的參數date格式為yyyy-MM-dd。

1、給定一個日期,獲取其本月的第一天和最后一天

function getCurMonthFirstDay($date) {
    return date('Y-m-01', strtotime($date));
}

function getCurMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month -1 day'));
}

2、給定一個日期,獲取其下月的第一天和最后一天

function getNextMonthFirstDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month'));
}

function getNextMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +2 month -1 day'));
}

3、給定一個日期,獲取其下月的第一天和最后一天

function getPrevMonthFirstDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 month'));
}

function getPrevMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 day'));
}

其中strtotime函數參數“+1 month”,php會根據具體月份來確定增加多少天,可能是28、29(2月)、30(小月)或 31(大月);某月的第一天 “-1 day” 自然就是上個月最后一天,php也會根據月來智能確定是28、29、30或31。

strtotime 的功能很強大,詳細用法可以查看官方文檔:http://php.net/manual/zh/function.strtotime.php

分類: PHP 標簽: ,

php 常用文件操作備忘

2013年8月8日 沒有評論

1、獲取文件名:basename();

2、獲取文件所在的目錄:dirname();

3、pathinfo()獲取文件信息,返回結果為一個array,包括路徑、文件全名、文件名和擴展名。例如:

$file = '/com/netingcn/error.log';
print_r(pathinfo($file));
結果為:
Array(
    [dirname] => /com/netingcn
    [basename] => error.log
    [extension] => log
    [filename] => error
)

4、判斷文件是否存在:is_file();

5、判斷目錄是否存在:is_dir();

6、判斷文件或目錄是否存在:file_exists();

7、讀取文件所有內容:file()或file_get_contents(),其中file()返回的是一個一行為元素的array,file_get_contents()把文件全部內容作為一個String返回;

8、寫文件fwrite,如:

$handler = fopen($file, 'w');	// w 會沖掉以前的內容、a 是追加
fwrite($handler, 'content');
fclose($handler);              //記得關閉打開的文件句柄

9、文件讀取操作有很多,下面簡單介紹幾個:

$handler = fopen($file, 'r');

while(!feof($handler)) {
    $datas[] = fgets($handler);		//讀取一行內容
}

while(!feof($handler)) {
    $datas[] = fgetss($handler);	//讀取一行內容并過來html標記
}

while(!feof($handler)) {
    $datas[] = fgetcsv($handler);	//讀取一行內容并解析csv字段
}

$content = fread($handler, $strLength);	//讀取指定長讀的字符

fclose($handler);
分類: PHP 標簽:

php 刪除數組中的元素

2013年8月7日 沒有評論

刪除數組中的元素,第一想法是使用unset函數,它確實可以刪除,但是可能會在后面操作該數組的時候出現問題。通過下面的例子來說明:

$arr = array(0, 1, 2, 3, 4);
$index = 2;
unset($arr[$index]);
echo count($arr);

if (empty($arr[$index])) {
    echo "arr[$index] is empty";
}

print_r($arr);

輸出為:
4
arr[2] is empty
Array([0] => 0 [1] => 1 [3] => 3 [4] => 4)

從上面的輸出結果可以看到數組的長度是正常的,但是下標還是保持原來的,所以按照下標去獲取元素就會出問題。另外此方法對key-value形式的數組是安全的。

如何安全的刪除元素呢?可以使用array_splice函數。array_splice()的用途是刪除原始數組中指定的一系列元素,并用其他值代替(如果指定),返回值是被刪除的元素。更多信息可以參考官方文檔:http://php.net/manual/zh/function.array-splice.php。例如:

$arr = array(0, 1, 2, 3, 4);
$rtn = array_splice($arr, 2, 1);
echo count($arr);
print_r($arr);
print_r($rtn);

輸出為:
4
Array
([0] => 0 [1] => 1 [2] => 3 [3] => 4)
Array([0] => 2)

如果想獲取刪除首位元素后的數組,則可以有兩種方法:

1、
$arr = array(0, 1, 2, 3, 4);
array_splice($arr, 0, 1);

2、
$arr = array(0, 1, 2, 3, 4);
$arr = array_splice($arr, 1);
分類: PHP 標簽: ,

無覓相關文章插件,快速提升流量

30选5怎么中奖