php輸入流
A. 請問哪位知道,php里 file_get_contents("php://input");這句是什麼意思
客戶端使用ajax技術中的post方法賀鬧向伺服器發送的所有內容都可以在伺服器中的一個特殊文件php://input中找到.
file_get_contents() 函數把整個文件讀入一個字元串中。
和 file() 一樣,不同的是 file_get_contents() 把文件讀入一個字元串。
file_get_contents() 函數是用於將文件的內容讀入到一個字元串中的首選方法。或鋒如果操作系統支持,還會使用內存映射技術來增強性能。
語法
file_get_contents(path,include_path,context,start,max_length)參數 描述
path 必需。規定要讀取的文件的路徑。
include_path 可選。如果也想在 include_path 中搜尋文件的話,可以將該參數設為 "1"。
context 可選。規定文件句柄的環境。
context 是一套可以修改流的行為的選項。若使用 null,則忽略。
start 可選。規定在文件中開始讀取的位置。該參數是 PHP 5.1 新加的。
max_length 可選。衫拍晌規定讀取的位元組數。該參數是 PHP 5.1 新加的。
整個函數把文件內容變成字元串了,你echo看看吧
B. 怎麼把EXCEL表裡的數據寫入資料庫
一.使用php
excel
parser
pro軟體,但是這個軟體為收費軟體;
二.可將excel表保存為csv格式,然後通過phpmyadmin或者sqlyog導入,sqlyog導入的方法為:
·將excel表另存為csv形式;
·打開sqlyog,對要導入的表格右擊,點擊「導入」-「導入使用載入本地csv數據」;
·在彈出的對話框中,點擊「改變..」,把選擇「填寫excel友好值」,點擊確定;
·在「從文件導入」中選擇要導入的csv文件路徑,點擊「導入」即可導入數據到表上;
三.一個比較笨的手工方法,就是先利用excel生成sql語句,然後再到mysql中運行,這種方法適用於excel表格導入到各類sql資料庫:
·假設你的表格有a、b、c三列數據,希望導入到你的資料庫中表格tablename,對應的欄位分別是col一、col二、col三
·在你的表格中增加一列,利用excel的公式自動生成sql語句,具體方法如下:
一)增加一列(假設是d列)
二)在第一行的d列,就是d一中輸入公式:
=concatenate("insert
into
tablename
(col一,col二,col三)
values
(",a一,",",b一,",",c一,");")
三)此時d一已經生成了如下的sql語句:
insert
into
table
(col一,col二,col三)
values
('a','一一','三三');
四)將d一的公式復制到所有行的d列(就是用滑鼠點住d一單元格的右下角一直拖拽下去啦)
5)此時d列已經生成了所有的sql語句
陸)把d列復制到一個純文本文件中,假設為sql.txt
·把sql.txt放到資料庫中運行即可,你可以用命令行導入,也可以用phpadmin運行
C. php 怎樣得到輸入流的類型
var_mp
D. PHP中put和post區別
1.使用支持和范圍的區別:
PHP提供了對PUT方法的支持,在Http定義的與伺服器的交互方法中,PUT是把消息本體中的消息發送到一個URL,形式上跟POST類似;
PHP 提供對諸如 Netscape Composer 和 W3C Amaya 等客戶端使用的 HTTP PUT 方法的支持;
PHP 4 中,必須使用標準的輸入流來讀取一個 HTTP PUT 的內容;
PUT方法沒有POST方法使用廣泛,但PUT方法卻是向伺服器上傳文件最有效率的方法:
2.上傳過程的區別:
POST上傳文件時,通常需要將所有的信息組合成multipart 傳送過去,然後伺服器再解碼這些信息,解碼過程則必不可少的會消耗內存和CPU資源,這種現象在上傳大文件時尤其明顯;
PUT方法則允許你通過與伺服器建立的socket鏈接傳遞文件的內容,而不附帶其他的信息,效果上更直接;
3.上傳效果的區別:
PHP 接受到 PUT 方法的請求時,會把上傳的文件儲存到和其它用 POST 方法處理過的文件相同的臨時目錄;請求結束時,臨時文件將被刪除。
用來處理 PUT 的 PHP 腳本必須將該文件拷貝到其它的地方;
4. POST和PUT請求根本區別
POST請求的URI表示處理該封閉實體的資源,該資源可能是個數據接收過程、某種協議的網關、或者接收註解的獨立實體;
PUT請求中的URI表示請求中封閉的實體-用戶代理知道URI的目標;
伺服器無法將請求應用到其他資源;
如果伺服器希望該請求應用到另一個URI,就必須發送一個301響應;
用戶代理可通過自己的判斷來決定是否轉發該請求;
E. api數據介面怎麼調用
API:應用程序介面(API:Application Program Interface)
應用程序介面(API:application programming interface)是一組定義、程序及協議的集合,通過 API 介面實現計算機軟體之間的相互通信。API 的一個主要功能是提供通用功能集。程序員通過使用 API 函數開發應用程序,從而可以避免編寫無用程序,以減輕編程任務。
遠程過程調用(RPC):通過作用在共享數據緩存器上的過程(或任務)實現程序間的通信。
標准查詢語言(SQL):是標準的訪問數據的查詢語言,通過通用資料庫實現應用程序間的數據共享。
文件傳輸:文件傳輸通過發送格式化文件實現應用程序間數據共享。
信息交付:指松耦合或緊耦合應用程序間的小型格式化信息,通過程序間的直接通信實現數據共享。
當前應用於 API 的標准包括 ANSI 標准 SQL API。另外還有一些應用於其它類型的標准尚在制定之中。A
F. 執行php.exe程序cli提示錯誤如何解決
#!/usr/local/bin/php –q
<?php
//Windows平台上,上行應該為:#!C:\php\php.exe -q
echo "你好 PHP CLI!";
?>
不要忘了給該文件設置為可執行的許可權:
$ chmod 755 myfile.php
然後直接輸入以下命令,按回車鍵即可以運行:
$ ./myfile.php
如果要在Windows系統下運行該腳本,則不需要設置文件屬性,
可以直接運行該腳本。
Microsoft Windows [版本 6.0.6000]
版權所有 (C) 2006 Microsoft Corporation。保留所有權利。
C:\ >myfile.php
你好 PHP CLI!
再重申一次:如果在Windows平台,CLI腳本的第一行一定要寫正確php.exe所在的位置,像這樣(另外,如果要在CLI腳本中加註釋語句,則要把注釋寫在PHP標簽裡面,因為CLI解釋只認識第一行,不在PHP標簽里認為是語法錯誤):
#!C:\php\php.exe -q
這樣,可以看到在命令行下信息已經列印出來,證明該CLI腳本已經成功運行。
2.從命令行上讀取參數
如果想從命令行獲取參數,CLI可以從$_SERVER['argc']和$_SERVER['argv'']取得參數的個數和值。我們再建立一個文件,名字為testargs.php,腳本代碼如下:
#!C:\php\php.exe –q
<?php
//UNIX和Linux平台下應該為#!/usr/local/bin/php –q
echo "測試獲取參數:\n";
echo $_SERVER["argc"]."\n";
//顯示傳入的參數值,從索引1開始顯示
echo $_SERVER["argv"][1]."\n";
echo $_SERVER["argv"][2]."\n";
echo $_SERVER["argv"][3]."\n";
echo $_SERVER["argv"][4]."\n";
?>
在命令行輸入如下代碼:
C:\Users\John>testargs.php Always To Be Best
測試獲取參數:
4
Always
To
Be
Best
因為我們輸入了一串單詞,為「Always To Be Best」,腳本參數以空格分隔。因此,PHP將其計為4個參數,下面對此說明。
$_SERVER["argc"]數組返回一個整型的數,代表從命令行上回車後一共輸入了幾個參數。
從上例的結果已經看出,要訪問已經傳入的參數值,需要從索引1開始。因為腳本本身的文件已經佔用了索引0,即$_SERVER["argv"][0]。
3.處理I/O通道
PHP最初設計不是用於與用戶直接的鍵盤輸入或文本輸出結合使用。了解這一設計是至關重要的,因為如果需要在命令行中執行任何操作,都必須能夠與用戶來回通信。
輸入輸出(I/O)通道這個思想來源於UNIX系統,UNIX系統提供3個文件句柄,用以從一個應用程序及用戶終端發送和接收數據。
我們可以把一個腳本的輸出重定向到一個文件:
php world.php > outputfile
如果是在UNIX系統下,也可以使用通道定向到另一個命令或應用程序中。例如:
php world.php | sort.
在PHP 5 CLI中,有一個文件流句柄,可以使用3個系統常量,分別為STDIN、STDOUT和STDERR。下面我們分別介紹。
(1)STDIN
STDIN全稱為standard in或standard input,標准輸入可以從終端取得任何數據。
格式:stdin (』php://stdin』)
下面的例子是顯示用戶輸入:
#!/usr/local/bin/php -q
<?php
$file = file_get_contents("php://stdin", "r");
echo $file;
?>
這段代碼的工作原理與cat命令很相似,回轉提供給它的所有輸入。但是,這時它還不能接收參數。
STDIN是PHP的標准輸入設備,利用它,CLI PHP腳本可以做更多的事情。如下面例子:
#!/usr/local/bin/php -q
<?php
//UNIX平台下第一行應該為#!/usr/bin/php –q
/* 如果STDIN未定義,將新定義一個STDIN輸入流 */
if(!defined("STDIN")) {
define("STDIN", fopen('php://stdin','r'))
}
echo "你好!你叫什麼名字(請輸入):\n";
$strName = fread(STDIN, 100); //從一個新行讀入80個字元
echo '歡迎你'.$strName."\n";
?>
該腳本執行後將顯示:
你好!你叫什麼名字(請輸入):
比如,輸入Raymond之後,將顯示:
歡迎你Raymond
(2)STDOUT
STDOUT全稱為standard out或standard output,標准輸出可以直接輸出到屏幕(也可以輸出到其他程序,使用STDIN取得),如果在PHP CLI模式里使用print或echo語句,則這些數據將發送到STDOUT。
格式:stdout (』php://stdout』)
我們還可以使用PHP函數進行數據流輸出。如下面例子:
#!/usr/local/bin/php –q
<?php
$STDOUT = fopen('php://stdout', 'w');
fwrite($STDOUT,"Hello World");
fclose($STDOUT);
?>
輸出結果如下:
Hello World
例如,echo和print命令列印到標准輸出。
#!/usr/local/bin/php –q
Output #1.
<?php
echo "Output #2.";
print "Output #3."
?>
這將得到:
Output #1.
Output #2.Output #3.
說明:PHP標記外的新行已被輸出,但是echo命令或print命令中沒有指示換行。事實上,命令提示符重新出現在Output #2.Output #3. 所在的行中。PHP擁有的任何其他列印函數將會像此函數一樣運行正常,任何寫迴文件的函數也是一樣的。
#!/usr/local/bin/php -q
<?php
$STDOUT = fopen("php://stdout", "w");
fwrite($STDOUT, "Output #1.");
fclose($STDOUT);
?>
以上代碼將把php://stdout作為輸出通道顯式打開,並且php://output通常以與php://stdout相同的方法運行。
(3)STDERR
STDERR全稱為standard error,在默認情況下會直接發送至用戶終端,當使用STDIN文件句柄從其他應用程序沒有讀取到數據時會生成一個「stdin.stderr」。
格式:stderr (』php://stderr』)
下面的腳本表示如何把一行文本輸出到錯誤流中。
#!/usr/local/bin/php –q
<?php
$STDERR = fopen('php://stderr', 'w');
fwrite($STDERR,"There was an Error");
fclose($STDERR);
?>
PHP 5.2可以直接使用STDOUT作為常量,而不是定義上面使用的變數$STDOUT,為了兼容之前版本,我們仍使用了自定義變數,如果您使用的是PHP 5.2,則可以參考STDIN的第二個例子。
4.後台運行CLI
如果正在運行一個進程,而且在退出賬戶時該進程還不會結束,即在系統後台或背景下運行,那麼就可以使用nohup命令。該命令可以在退出賬戶之後繼續運行相應的進程。
nohup在英文中就是不掛起的意思(no hang up)。該命令的一般形式為:
nohup –f scriptname.php &
使用nohup命令提交作業,在默認情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件。
nohup scriptname.php > log.txt &
這樣,PHP CLI腳本執行後的結果將輸出到log.txt中,我們可以使用tail命令查看該內容:
tail -n50 -f log.txt
現在再來實現兩個例子,第一個是每隔10分鍾自動生成一個靜態HTML文件,並一直執行下去。腳本代碼如下:
#! /usr/local/bin/php
<?php
set_time_limit(0);
while(true){
@fopen("/usr/local/www/data-dist/content/
article_".time().".html","w");
sleep(600);
}
?>
保存並且退出vi編輯器,然後賦予genHTML.php文件可執行許可權:
#>chmod 755 genHTML.php
然後讓腳本在後台執行,執行如下命令:
$nohup genHTML.php –f &
執行上述命令後出現如下提示:
[1] 16623
按回車鍵後將出現shell提示符。上面的提示就是說,所有命令執行的輸出信息都會放到nohup.out文件中。
執行上面命令後,每隔10分鍾就會在指定的目錄生成指定的HTML文件,如article_111990120.html等文件。
如何終止CLI程序的後台運行呢?
可以使用kill命令來終止這個進程,終止進程之前要知道進程的PID號,即進程ID,我們使用ps命令:
www# ps
PID TT STAT TIME COMMAND
561 v0 Is+ 0:00.00 /usr/libexec/getty Pc ttyv0
562 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1
563 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2
564 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3
565 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4
566 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5
567 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6
568 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7
16180 p0 I 0:00.01 su
16181 p0 S 0:00.06 _su (csh)
16695 p0 R+ 0:00.00 ps
16623 p0 S 0:00.06 /usr/local/bin/php /usr/local/www/data/genHTML.php
已經看到PHP的進程ID是:16623,於是再執行kill命令:
$ kill -9 16623
[1]+ Killed nohup /usr/local/www/data/genHTML.php
這時該命令的進程就已經被終止了,再使用ps命令:
$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00.00 ps
剛才的PHP CLI腳本已經沒有了,如果直接運行ps命令無法看到進程,那麼就結合使用ps & apos兩個命令來查看。
注意:上面例子必須運行在UNIX或者Linux系統中,如FreeBSD、Redhat Linux等,在Windows環境不支持nohup命令。
G. <INPUT TYPE="file" 中的參數是如何傳遞的
ENCTYPE="multipart/form-data"
<form>標簽里要加這樣一個參數,不加這參數,上傳到伺服器的只是文件路徑,豪無用處。上傳的數據會以一定備塵的表單格式上傳到伺服器,這個格式是固定的
你在servlet中request.getInputStream打開仿毀禪輸入流,然後把裡面的數據全部保存到一個文件里去,看看余如這文件你就知道該怎麼寫了。
H. phpstorm寫的程序在控制台運行時輸出亂碼
產生原因:因為這個開源項目的默認字元編碼不對,所以控制台的字元編碼也自動變成了UTF-8,而鍵盤的輸入流的默認格式是GBK格式,這樣就造成了在GBK轉UTF-8的過程中產生的奇數亂碼錯誤(這個問題的解釋可以在搜索引擎找到)。
解決辦法:
1.在代碼區域右鍵 -> run as -> run configurations -> common(右側) -> console encoding
出現此錯誤,此時的編碼格式應該是UTF-8,選擇Other,這時可能沒有GBK選項,沒有,則執行之後操作。
2.更改該項目的文本文件編碼,項目右鍵 -> properties -> resource -> 先將 text file encoding調整回GBK,然後再回去重新設置console encoding編碼為GBK。
的基礎上,通過進一步的推理而概括出來的,因而不
I. POST請求的幾種content type類型
content-type是http請求的響應頭和請求頭的欄位。當作為響應頭時,告訴客戶端實際返回的內容的內容類型。作為請求頭時(post或者put),客戶端告訴伺服器實際發送的數據類型。
在前端開發過程中,通常需要跟後端工程師對接介面的數據格式,不同的數據類型對於伺服器來說有不同的處理方式,因此我們需要關注不同的conten-type類型.
1. application/x-www-form-urlencoded
瀏覽器原生form表單默認的提交方式(在不設置enctype的情況下)。此時請求頭的格式如下:
content-type: application/x-www-form-urlencoded;charset=utf-8
form-data: key1=val1&key2=val2
此時後端例如php可以通過$_POST["key1"]的方法來獲取參數值。
此種情況下:非字母或數字的字元會被進行編碼(編碼方式 https://developer.mozilla.org/zh-CN/docs/Glossary/percent-encoding ),這也是為什麼這種方式不支持二進制數據的原因。
2. multipart/form-data
與application/x-www-form-urlencoded 的區別是她支持文件的傳輸,並且它的傳輸數據放在request-payload里,並且以bounday進行分隔。
POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"
--boundary
Content-Disposition: form-data; name="field1"
value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
3. application/json
格式是這樣的:
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
它用來告訴服務端消息主體是 序列化後的 JSON 字元串 ,其中一個好處就是JSON 格式支持比鍵值對復雜得多的結構化數據。此時php不能直接通過$_POST獲取,需要先從php://input里獲得原始輸入流,再json_decode成對象
4.text/plain
傳統的ajax請求提交
function submit2() {
var xhr = new XMLHttpRequest();
xhr.timeout = 3000;
var obj = {a: 1, b: 2};
xhr.open('POST', '/');
xhr.send(obj);
}
另外,對於axios請求,不同的請求方式content-type也不同
function submit3() {
var sence1 = 'name=123&val=456';
var sence2 = {name: 123, val: 456};
axios.post('/', sence1)
}
1. 當傳遞的是字元串的時候
2. 當傳遞的是對象的時候
總結
1.傳統的ajax請求時候,Content-Type默認為"文本"類型。
2.傳統的form提交的時候,Content-Type默認為"Form"類型。
3.axios傳遞字元串的時候,Content-Type默認為"Form"類型。
4.axios傳遞對象的時候,Content-Type默認為"JSON"類型
J. php CI 怎麼獲取 request payload 的值
php 怎麼獲取像這樣的內容啊 用輸入流的獲取方式獲取不到 如file_get_contents("php://input")