鍍金池/ 問(wèn)答/ PHP問(wèn)答

如果你的登錄認(rèn)證用的是自帶的Auth,那么就有這種可能。
Auth是分guard的,guard就是用來(lái)解決這種前后端不同賬戶系統(tǒng)登錄的。
看看是不是用到的guard不一樣。

失心人 回答

flock的是建議鎖,因此不適合題主的需求

乞許 回答

無(wú)法顯示是什么情況, 服務(wù)器上有 php 環(huán)境嗎, phpmyadmin依賴php 運(yùn)行環(huán)境的

硬扛 回答
  1. 配置了php-fpm也不能解析php文件,nginx只是個(gè)轉(zhuǎn)發(fā),fastcgi_pass就像proxy_pass一樣,轉(zhuǎn)發(fā)
  2. 解析PHP的是php-fpm
  3. php-cgi實(shí)現(xiàn)CGI(通用網(wǎng)關(guān)接口,來(lái)新請(qǐng)求就需要fork新進(jìn)程處理,效率低),php-fpm實(shí)現(xiàn)fastcgi(進(jìn)程一直存活)
  4. fastcgi是協(xié)議,php-fpm根據(jù)該協(xié)議數(shù)據(jù)進(jìn)程請(qǐng)求處理與響應(yīng),nginx根據(jù)該協(xié)議發(fā)出請(qǐng)求到php-fpm以及收取php-fpm返回的數(shù)據(jù)
我以為 回答

說(shuō)下自己的理解,供參考。假設(shè)題主了解網(wǎng)絡(luò)編程和計(jì)算機(jī)系統(tǒng)的一些基本概念。

簡(jiǎn)單概括來(lái)說(shuō),事件驅(qū)動(dòng)是實(shí)現(xiàn)并發(fā)處理的一種方式。

我們就以HTTP請(qǐng)求的處理過(guò)程為例,為簡(jiǎn)化說(shuō)明,僅考慮網(wǎng)絡(luò)IO,不考慮文件IO和數(shù)據(jù)庫(kù)等其他過(guò)程,也不考慮多核系統(tǒng)。
考慮采用如下最簡(jiǎn)模型來(lái)處理HTTP請(qǐng)求:

main_loop:
  accept() 
  recv()  
  parse() 
  send() 
  close() 

來(lái)一個(gè)連接,讀取數(shù)據(jù)(請(qǐng)求),解析請(qǐng)求內(nèi)容,返回?cái)?shù)據(jù)(應(yīng)答)。
同一時(shí)間只為一個(gè)客戶端服務(wù)。在為A客戶端服務(wù)的過(guò)程中,B客戶端必須等待。

這種方式非常簡(jiǎn)單直接,容易理解,但其無(wú)法滿足現(xiàn)實(shí)場(chǎng)景的需要——不支持并發(fā)。
現(xiàn)實(shí)中,客戶端的請(qǐng)求是并發(fā)的:即當(dāng)一個(gè)客戶端的請(qǐng)求還在處理時(shí),另外一個(gè)客戶端的請(qǐng)求就會(huì)達(dá)到,甚至多個(gè)客戶端的請(qǐng)求同時(shí)達(dá)到。
而且,recv 和 send等涉及網(wǎng)絡(luò)操作的API由于網(wǎng)絡(luò)數(shù)據(jù)發(fā)送與到達(dá)的不確定性,可能需要等待,CPU會(huì)空閑下來(lái)——但這種模型下即使CPU空閑了也無(wú)法處理其他客戶端的請(qǐng)求,浪費(fèi)了CPU。

我們采用如下多線程模型,可以解決上述問(wèn)題:

main_loop:
  accept() 
  start_thread(thread_loop)

thread_loop:    
    recv()  
    parse() 
    send() 
    close() 
    exit thread()

即每個(gè)客戶端在一個(gè)獨(dú)立的線程中處理。
當(dāng)一個(gè)客戶端的線程執(zhí)行網(wǎng)絡(luò)操作需要等待時(shí),會(huì)被操作系統(tǒng)調(diào)度出去,執(zhí)行其他需要干活兒的線程。
似乎完美了解決了我們的問(wèn)題?
然而并沒(méi)有。
因?yàn)椴僮飨到y(tǒng)創(chuàng)建線程的開(kāi)銷是比較大的,能夠支持的線程數(shù)量是有限的,通常是幾萬(wàn)的級(jí)別,如果線程太多,就會(huì)有很多的CPU浪費(fèi)在了線程的創(chuàng)建、銷毀、調(diào)度等管理操作上。

所以為了充分發(fā)揮CPU的能力,支持更多的并發(fā)數(shù)量,,在Linux上有另外一種處理并發(fā)的方式:
內(nèi)核提供了監(jiān)聽(tīng)大量網(wǎng)絡(luò)連接(句柄)可讀、可寫等事件的機(jī)制和接口。
應(yīng)用把需要監(jiān)聽(tīng)對(duì)象以及關(guān)心的事件注冊(cè)給內(nèi)核,內(nèi)核在有事件達(dá)到時(shí)通知應(yīng)用處理。
基于這種機(jī)制處理并發(fā)就是事件驅(qū)動(dòng)。

事件驅(qū)動(dòng)機(jī)制的基本模型是:

create_listen_socket()
register_event_for_listen_socket()
main_loop:
    wait_for_event()
    check_events:
         if listen_socket has event(new client coming) :
               accept()
               register_event_for_client_socket()
        if client_socket has event(new data coming):
               recv()                       
               parse()
               send()              

但這里有一個(gè)問(wèn)題,有可能一個(gè)客戶端剛讀取了一部分?jǐn)?shù)據(jù),就沒(méi)了,剩下的還在網(wǎng)絡(luò)中沒(méi)過(guò)來(lái),需要繼續(xù)等待。
這就需要把當(dāng)前的讀取內(nèi)容和請(qǐng)求處理狀態(tài)(也即上下文)保存起來(lái),繼續(xù)處理其他客戶端的事件。
然后下次這個(gè)客戶端再有事件到來(lái)時(shí)再找回上下文繼續(xù)處理。
這其實(shí)需要應(yīng)用自己做一些任務(wù)調(diào)度相關(guān)的上下文保存和切換工作。

當(dāng)使用多線程處理并發(fā)時(shí),操作系統(tǒng)幫我們做了這些工作,我們無(wú)需關(guān)心任務(wù)切換。
因?yàn)橐粋€(gè)線程就只處理一個(gè)客戶端,反復(fù)調(diào)用recv把一個(gè)請(qǐng)求的數(shù)據(jù)讀完然后解析處理就可以了,也不用擔(dān)心沒(méi)數(shù)據(jù)到來(lái)時(shí),recv阻塞了其他客戶端的處理。
所以多線程編寫并發(fā)代碼非常簡(jiǎn)單直接。

如上,事件驅(qū)動(dòng)機(jī)制是Linux上解決并發(fā)問(wèn)題的一種高效編程模型。
應(yīng)用反復(fù)探測(cè)事件,對(duì)接收到的事件進(jìn)行逐個(gè)處理的過(guò)程就是事件循環(huán)。

那么同步和異步概念體現(xiàn)在哪里呢?

所謂同步就是我們執(zhí)行一個(gè)任務(wù),一直等待任務(wù)執(zhí)行結(jié)束。
所謂異步就是我們執(zhí)行一個(gè)任務(wù),不等待任務(wù)執(zhí)行結(jié)束,繼續(xù)去干其他活兒,任務(wù)結(jié)果后有個(gè)通知,或者干脆不關(guān)心任務(wù)的執(zhí)行結(jié)果。

在多線程模型中,每接收到一個(gè)新的客戶端就創(chuàng)建一個(gè)線程處理,這就是一種異步處理。
在事件驅(qū)動(dòng)模型中,當(dāng)沒(méi)有數(shù)據(jù)可讀時(shí),就把這個(gè)客戶端繼續(xù)放到監(jiān)聽(tīng)隊(duì)列中監(jiān)聽(tīng),也是一種異步。

如果我們考慮文件IO,把IO請(qǐng)求丟給另外一個(gè)或一組線程(線程池)處理,處理完后通知主線程,也是一種異步。

尋仙 回答

暫時(shí)把防火墻關(guān)閉,還有SElinux。

systemctl stop firewalld.service 

修改/etc/selinux/config文件中設(shè)置SELINUX=disabled ,然后重啟服務(wù)器。


實(shí)在不行的話 修改nginx.conf     #user  nobody;  把這個(gè)打開(kāi)。

還有可能不是nginx的緣故,mac上防火墻也有關(guān)系。
初念 回答

openssl應(yīng)該跟發(fā)郵件沒(méi)關(guān)系。估計(jì)是Linux環(huán)境中mail()函數(shù)沒(méi)有開(kāi)啟,可以排查下

兔寶寶 回答
除`fastcgi_params`可以設(shè)置`doc_root`外,php.ini里面還可以配置`doc_root`,他會(huì)把你`fastcgi.conf`里面的`$document_root`參數(shù)覆蓋掉,所以在php.ini中確保`doc_root`是空的,你這個(gè)問(wèn)題應(yīng)該是`fastcgi.conf`里面的open_basedir里面指向的路徑不對(duì)。
你可以在站點(diǎn)配置文件里面加上`open_basedir`試試
`open_basedir=yourpath:/tmp/:/proc/`
歆久 回答

https://account.aliyun.com/lo...

我沒(méi)登錄的 點(diǎn)擊LZ發(fā)的鏈接是這個(gè)·

不知道LZ指的是哪些。。因?yàn)榭床蝗?有一些有可能是防止JS緩存

過(guò)客 回答

為方便用戶不是每次都顯示,輸錯(cuò)密碼幾次就顯示了,記得數(shù)據(jù)庫(kù)里有相應(yīng)的配置選項(xiàng),可以控制驗(yàn)證碼是不是每次都顯示.

查看一下thinkox_configname='VERIFY_OPEN'的值,清一下緩存試試.

傲寒 回答

CURLOPT_SSL_VERIFYPEER 新版php中默認(rèn)是2

這個(gè)和用戶是咩有關(guān)系的,我猜測(cè)你可能出現(xiàn)的問(wèn)題哈
一、你的服務(wù)器443端口是無(wú)法訪問(wèn)的,因?yàn)閔ttps走的是443端口不是80端口。
二、比如你在以前的網(wǎng)站中的請(qǐng)求寫死成http的了,現(xiàn)在請(qǐng)求的時(shí)候會(huì)有跨域的問(wèn)題了。
三、這個(gè)我覺(jué)得你們應(yīng)該是做的,就是https是不能隨意變動(dòng)的,是需要安全憑證的,你可以免費(fèi)申請(qǐng)一個(gè)放到你的服務(wù)器

痞性 回答

可以使用 try files 解決

# ServiceA配置 
locaton ^~ /ServiceA { 
    root Path/to/A ;
    #index.index.html index.htm 
    try_files $url  index.html;
}
敢試 回答

php.ini

#修改上傳文件大小限制
upload_max_filesize=16M
#修改可申請(qǐng)內(nèi)存限制
memory_limit=128M
#post數(shù)據(jù)的最大限制
post_max_size=32M
挽青絲 回答

1:下載composer.phar,官網(wǎng)有直接下載的鏈接,https://getcomposer.org/downl...

2:composer.phar 復(fù)制到項(xiàng)目根目錄,比如我的是:/home/www/web

3:執(zhí)行 /usr/local/php7/bin/php composer.phar update (這里我的安裝路徑是/usr/local/php7/bin/php,不一定適合你額,請(qǐng)對(duì)號(hào)入座即可吧)

4:安裝依賴包:/usr/local/php7/bin/php composer.phar require laravel/scout

笑浮塵 回答

不太可能,一定是其它地方出了問(wèn)題,建議好好測(cè)一下。

款爺 回答
INSERT INTO dede_addonarticle VALUES (12345,3,"This is the content","http://url.com","xxx","yyy")

慢慢拼吧,建議活用str.format語(yǔ)句。

拮據(jù) 回答
  • UserController 的 beforeAction
    public function beforeAction($action)
    {/*{{{*/
        if (parent::beforeAction($action)) {

            //... UserController 的 beforeAction 需要做的。

            return true;
        }
        return false;
    }/*}}}*/
  • BaseController 的 beforeAction
    public function beforeAction($action)
    {/*{{{*/
        if (parent::beforeAction($action)) {

            //... BaseController 的 beforeAction 需要做的。

            return true;
        }
        return false;
    }/*}}}*/