成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

php開(kāi)發(fā)過(guò)程中不怎么常見(jiàn)的問(wèn)題

April / 2398人閱讀

日常開(kāi)發(fā)中碰到就記一下, 如果有朋友愿意分享的 bug 可以在評(píng)論中討論啊
url 當(dāng)中的參數(shù)有 ×tamp=1234567890這樣的字段會(huì)被轉(zhuǎn)義成xtamp=1234567890

這個(gè)不僅存在于頁(yè)面解析當(dāng)中,當(dāng)使用 curl 請(qǐng)求時(shí)拼接的參數(shù)有這種格式的也會(huì)發(fā)生轉(zhuǎn)義
解決方法有兩個(gè):

把 timestamp 這個(gè)參數(shù)放在 urlQuery 的最前面, ?timestamp=1234567890 這樣避免出現(xiàn) &time發(fā)生轉(zhuǎn)義的情況

&&來(lái)代替

Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version.

出現(xiàn)這句話通常說(shuō)明你在用的 php 版本是5.6.而且在php<=5.6的時(shí)候,進(jìn)行 application/json格式的 post 提交會(huì)把數(shù)據(jù)放在$HTTP_RAW_POST_DATA這個(gè)系統(tǒng)變量里面,在php>=7的時(shí)候這個(gè)變量被移除了,統(tǒng)統(tǒng)歸總到php://input這里
解決方法:

根據(jù)系統(tǒng)提示的走:

Although that indeed would be technically impossible (as $HTTP_RAW_POST_DATA is populated in the bootstrapping phase of the PHP process) allow one to override the setting by means of calling ini_set.
要確保自己的系統(tǒng)中沒(méi)有使用 `HTTP_RAW_POST_DATA`這個(gè)變量,直接在`php.ini`里面禁掉它的設(shè)置,但是容易出現(xiàn)系統(tǒng)中又打開(kāi)的情況(在框架中很常見(jiàn))

改一下自己的提交方式, 使用 application/form-data或者application/x-www-form-urlencoded這種格式的提交, 然后在后端接收數(shù)據(jù)的時(shí)候再轉(zhuǎn)成自己需要的格式(通常是數(shù)組)
參考資料

Exception "yiidbException" with message "SQLSTATE[HY000] [2002] No such file or directory"

這種情況出現(xiàn)在平時(shí)運(yùn)行的好好的, 但是突然換 cli 模式后這個(gè)配置就出問(wèn)題了,原因在當(dāng) host=localhost時(shí)走的是 unix:socket 鏈接, 當(dāng)host=127.0.0.1走的是 tcp 鏈接,這在php-fpmphp-cli中有點(diǎn)區(qū)別,尤其是本地沒(méi)有安裝 mysql 的時(shí)候
解決方法有三種:

將本地鏈接配置統(tǒng)一成 127.0.0.1

查看 MySQL 中的user表, host=localhosthost=127.0.0.1是不是用的同一個(gè)賬號(hào)密碼

配置php.ini文件中的pdo_mysql.default_socket= 寫(xiě)上完整的 socket 路徑

以上三種方法都可以試一下
參考資料

常駐內(nèi)存時(shí)發(fā)生的事情

這個(gè)是 phper 很少碰到但是很常見(jiàn)的情況, 比如用 swoole 啟動(dòng)了一個(gè)常駐進(jìn)程的服務(wù), 那么就一定要小心使用靜態(tài)變量,在同步模式下會(huì)發(fā)生變量污染, 還有就是 redis,mysql 這類(lèi)的鏈接,你會(huì)發(fā)現(xiàn)長(zhǎng)時(shí)間靜置以后就會(huì)出現(xiàn)一些摸不著頭腦的問(wèn)題, 這種情況不妨想一下是不是 server 端回收了這個(gè) socket,因此在 client 端怎么都寫(xiě)入不進(jìn)去. 還有就是 php 在讀取消息的時(shí)候,出現(xiàn)消息過(guò)長(zhǎng)的情況,那么就要考慮EOF終止符的問(wèn)題了... 單次 http 每一次請(qǐng)求都是全新的代碼, 不用自己考慮 gc 的問(wèn)題, 但是在常駐內(nèi)存的時(shí)候,這些就是一個(gè)個(gè)的大坑了

mysql has gone away

產(chǎn)生這個(gè)錯(cuò)誤的主要原因是 mysql server 端斷開(kāi)了鏈接, client 端還拿著這個(gè)句柄去請(qǐng)求,解決方式有兩種:

show global variables like "%timeout"; 查看 wait_timeout 的時(shí)長(zhǎng),適當(dāng)?shù)恼{(diào)長(zhǎng)一點(diǎn), 這種方法治標(biāo)不治本,而且有隱患

mysql> set global wait_timeout=10;
mysql> show global variables like "wait_timeout";

使用 mysql 之前需要 mysql_ping() 一下, 如果出現(xiàn)斷開(kāi)的錯(cuò)誤就啟動(dòng)重連機(jī)制

js 和 php 交互傳中文參數(shù)的編解碼問(wèn)題

之前碰到了問(wèn)題是:
在 php 端 urlencode 的值為:

orderid%3D21111111110001954%26pid%3D257742%26reason%3D%E4%B8%AA%E4%BA%BA%E6%96%B9%E9%9D%A2%E5%8E%9F%E5%9B%A0_%E4%BD%BF%E7%94%A8%E7%BA%A2%E5%8C%85%E9%87%8D%E6%96%B0%E4%B8%8B%E5%8D%95%26token%3D041d9e5575f480b7bfd58b09bd14ab1c7ee9e9594f2fcdb9f0e3e39fc634b48f

需要 urldecode 一次

而在 js 端的結(jié)果是:

orderid%3D21111111110002170%26pid%3D257742%26reason%3D%25E4%25B8%25AA%25E4%25BA%25BA%25E6%2596%25B9%25E9%259D%25A2%25E5%258E%259F%25E5%259B%25A0_%25E4%25B8%25AA%25E4%25BA%25BA%25E8%25BA%25AB%25E4%25BD%2593%25E5%258E%259F%25E5%259B%25A0%26token%3D041d9e5575f480b7bfd58b09bd14ab1c7ee9e9594f2fcdb9f0e3e39fc634b48f

需要 urldecode 兩次

查閱資料后:

在后端是PHP程序的情況下,保持前端Javascript和PHP之間傳值的統(tǒng)一編碼可以使用以下函數(shù)進(jìn)行處理:
 
WEB前端JavaScript
 
編碼:escape(encodeURI(string))
 
解碼:unescape(decodeURI(string))
 
WEB后端Php
 
編碼:urlencode(string)
 
解碼:urldecode(urldecode(string))

為什么要encodeURI(url)兩次才不會(huì)出現(xiàn)亂碼?

PHP中rawurlencode和urlencode、JS中encodeURI與encodeURIComponent 的區(qū)別

rawurlencode遵守是94年國(guó)際標(biāo)準(zhǔn)備忘錄RFC 1738

urlencode實(shí)現(xiàn)的是傳統(tǒng)做法,和上者的主要區(qū)別是對(duì)空格的轉(zhuǎn)義是"+"而不是"%20"
javascript的encodeURL也是94年標(biāo)準(zhǔn),而javascript的escape是另一種用"%xxx"標(biāo)記unicode編碼的方法。
推薦在PHP中使用用rawurlencode。棄用urlencode

樣例
source:
超級(jí)無(wú)敵的人sadha sajdh數(shù)據(jù)樣本sdls fhejrthcxzb.file.jpeg

PHP urlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha+sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls+fhejrthcxzb.file.jpeg

PHP rawurlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

Javascript encodeURI|encodeURIComponent:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

Javascript escape:
%u8D85%u7EA7%u65E0%u654C%u7684%u4EBAsadha%20sajdh%u6570%u636E%u6837%u672Csdls%20fhejrthcxzb.file.jpeg

帖子原文

在前端還有個(gè)問(wèn)題就是, js 的 encodeURIComponentencodeURI 都不會(huì)轉(zhuǎn)換 _-.!~*"()# 這些保留字符, 而在后端的rawurlencode 則是會(huì)轉(zhuǎn)換的, 因此需要前端多帶帶把這幾個(gè)給拎出來(lái), 如下:

"*".charCodeAt(0) // 42
String.fromCharCode(42) // *

這里有張圖說(shuō)的很明白

圖片來(lái)源

關(guān)于出現(xiàn) 這種 zero-width space 字符

如果出現(xiàn) mb_substr 這類(lèi)操作的時(shí)候, 會(huì)出現(xiàn)字?jǐn)?shù)判斷錯(cuò)誤的問(wèn)題, 這個(gè)有時(shí)候很難排查, 因?yàn)樵?win 上,使用命令行或者 linux 上用cat命令是看不到字符間是有 的, 如下:

這玩意兒出現(xiàn)的場(chǎng)景就是: 在前端輸入框中輸入幾個(gè)字, 然后復(fù)制粘貼. 這樣盡管看起來(lái)之間沒(méi)有空格, 但是其中還是插入了這個(gè)字符
這玩意就叫 zero-width space 零寬空格, 處理的辦法也很簡(jiǎn)單, 前端傳值之前給過(guò)濾一下, 比如 https://stackoverflow.com/que... 或 https://codeday.me/bug/201711...

后端 php 處理的話和這個(gè)不一樣, 使用 utf-8 的處理方式, 可以參考這篇文章 特殊字符<200b><200c><200d>的刪除辦法與原理

替換這種編碼

$value = str_replace("xe2x80x8b", "", $value);
$value = str_replace("xe2x80x8c", "", $value);
$value = str_replace("xe2x80x8d", "", $value);

編碼對(duì)照如下:

我的博客

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29240.html

相關(guān)文章

  • PHP小知識(shí)點(diǎn)

    摘要:那些瑣碎的知識(shí)點(diǎn)作者記錄的的很奇特很難記的知識(shí)點(diǎn)。易錯(cuò)知識(shí)點(diǎn)整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細(xì)微的差別。今天手頭不忙,總結(jié)一下,分享過(guò)程中掌握的知識(shí)點(diǎn)。 深入理解 PHP 之:Nginx 與 FPM 的工作機(jī)制 這篇文章從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識(shí)...

    hover_lew 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • 如何"有計(jì)劃,高效率,優(yōu)簡(jiǎn)歷"應(yīng)對(duì)面試

    摘要:雖然有了十全的計(jì)劃,但如何高效率去記住上面那么多東西是一個(gè)大問(wèn)題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無(wú)準(zhǔn)備就去面試的后果,一開(kāi)始心態(tài)真的爆炸,但是又不服氣,一想到每次回來(lái)后家人朋友問(wèn)我面試結(jié)果的期待臉,越覺(jué)得必須付出的行動(dòng)來(lái)證明自己了。 面經(jīng)傳送門(mén):一個(gè)1年工作經(jīng)驗(yàn)的PHP程序員是如何被面試官虐的? 下面是我花費(fèi)兩個(gè)星期做的準(zhǔn)備,主要分三部分: 有計(jì)劃——計(jì)劃好...

    gyl_coder 評(píng)論0 收藏0
  • 高級(jí)PHP工程師應(yīng)該具備一些技能

    摘要:很多面試,很多人員能力要求都有高級(jí)工程師的字眼,如果您真心喜歡,并且您剛起步,那么我簡(jiǎn)單說(shuō)說(shuō)一個(gè)高級(jí)工程師所應(yīng)該具備的,希望給初級(jí)或已經(jīng)達(dá)到中級(jí)的工程師一些幫助。程序的執(zhí)行順序問(wèn)題。 初次接觸PHP,就為其美所折服,于是一發(fā)不可收拾。 很多面試,很多人員能力要求都有PHP高級(jí)工程師的字眼,如果您真心喜歡PHP,并且您剛起步,那么我簡(jiǎn)單說(shuō)說(shuō)一個(gè)PHP高級(jí)工程師所應(yīng)該具備的,希望給初級(jí)或已...

    Lsnsh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<