最近發現一個奇怪的事件,剛編輯好的php文件上傳到Linux服務器上,然后下載后就發現代碼在一行,換行符丟失了,找了好久才找到解決辦法,分享如下。
在使用ftp軟件上傳下載php源文件時,我們偶爾會發現在本地windows下notepad++編輯器寫好的php文件,在使用ftp上傳到linux服務器后,php文件的換行符全部丟失了,導致php文件無法正常運行。
這個時候,再次通過ftp軟件把剛才上傳的php文件下載到本地windows,用notepad++編輯器打開后,發現php源代碼變成了一行,換行丟失。
發生這種情況的原因是什么呢?飄易就以一句話概括下:
由于linux下換行是n,而windows下換行是rn,當ftp軟件在上傳時,默認是以ASCII方式上傳的,而ASCII方式上傳文件有個特點,會將文件里的換行符進行適當處理以符合上傳服務器的運行環境。在這個過程中,部分文件就會處理不當,出現換行符丟失的bug。(注意,不是全部php文件,是小部分的php文件會出現這個問題)。
上訴問題尤其在php源碼里有單行注釋符“//”時,會導致php源文件直接無法運行。因為源碼變成了一行代碼后,單行注釋符把//后面所有的代碼都注釋掉了。
FTP上傳bug解決方法:
方法1:將單行注釋符 // 改成 多行注釋符 /* 注釋文字 */ 這樣即使換行符丟失,也不影響后面源碼的執行。(但是下載到本地二次修改時,依然是件頭疼的事!)
方法2:FTP上傳php文件不要使用ASCII模式,全部使用二進制方式。這是最保險的。 如何設置ftp軟件以二進制方式Binary上傳,請網絡搜索下自己使用的ftp軟件的設置方式。
知識補充:FTP的ASCII和Binary傳輸模式:
FTP有ASCII和Binary兩種傳輸模式:
Binary模式不會對數據進行任何處理。
Ascii模式會將回車換行轉換為本機的回車字符。
由于WINDOWS和UNIX的行結束符不一樣。所以從WINDOWS用Binary傳輸方式傳輸文本文件到UNIX時可能會出現^M。同樣從UNIX用Binary方式傳輸文件到WINDOWS時,也可能出現回車換行顯示不正確的問題。
WINDOWS下新建ftp_ascii.txt內容如下:
- hello word!
- WINDOWD TO UNIX !
- TEST FTP ASCII;
我們分別用兩種模式上傳到UNIX.
ASCII模式正常
- vi ftp_ascii.txt
- hello word!
- WINDOWD TO UNIX !
- TEST FTP ASCII;
二進制模式 Binary有問題
- vi ftp_ascii.txt
- hello word!^M
- WINDOWD TO UNIX !^M
- TEST FTP Binary;
由此可知我們采用ASCII模式傳輸文本可以避免傳輸中的^M問題,FTP中雖然ASCII模式可以避免^M的問題,但大多數情況還是選擇Binary方式,這樣可以保證傳輸的內容不會被改變,尤其是在傳輸可執行文件如php源碼時,大多選用binary方式.
在FlashFXP中可以在菜單->會話->傳輸模式中 選擇ASCII,BINARY,自動三種模式.
另外,我們以ssh登錄sftp的方式上傳文件時,也可以避免換行丟失的問題.
新聞熱點
疑難解答