1

これは、1つのファイルに100を超えるブックを作成するために作成した関数です。コードは正常に機能しますが、プロセス全体を完了するのに時間がかかります。これらをもっと速くする方法を知りたいです。この投稿を読んでいただきありがとうございます。

function allStats() {


    $data['total'] = $this->poster_model->numberTotalPiosters();
    $data['allPosters'] = $this->poster_model->getAllPosters(); 



    require(APPPATH.'third_party/gapi.php');
    $ga = new gapi('xxx@xxxx', 'xxxxx');

    require(APPPATH.'third_party/PHPExcel.php');
    require(APPPATH.'third_party/PHPExcel/Writer/Excel2007.php');

    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getProperties()->setCreator("xxxxxx");
    $objPHPExcel->getProperties()->setLastModifiedBy("xxxxxx");
    $objPHPExcel->getProperties()->setTitle("xxxxxxx");
    $objPHPExcel->getProperties()->setSubject("xxxxxx");
    $objPHPExcel->getProperties()->setDescription("xxxxx (".$data['allPosters'][$i]['PDF_Name'].")");

    $i=0;

    while ($i < 150) 
    {

        if($data['allPosters'][$i]['Translations']==0)
        {

        if(time() < strtotime($data['allPosters'][$i]['Expiry_Date'])){
            $expiry = date('Y-m-d');
            $limit = round((strtotime($data['allPosters'][$i]['Expiry_Date']) - time()) / 86400);
        }else if(strtotime($data['allPosters'][$i]['Expiry_Date']) == strtotime($data['allPosters'][$i]['Presentation_Date'])){
            $expiry = strtotime($data['allPosters'][$i]['Presentation_Date']) + 86400;
            $limit = 1;
        }else{
            $expiry = date('Y-m-d', strtotime($data['allPosters'][$i]['Expiry_Date']));
            $limit = round((strtotime($data['allPosters'][$i]['Expiry_Date']) - strtotime($data['allPosters'][$i]['Presentation_Date'])) / 86400);

        }

        $ga->requestReportData(
            xxxxxxxx,
            array('date','eventAction'),
            array('uniqueEvents'), 
            array('eventAction'),
            'eventAction=='.base_url().'uploads/'.$data['allPosters'][$i]['PDF_Name'], 
            date('Y-m-d', strtotime($data['allPosters'][$i]['Presentation_Date'])), 
            $expiry, 
            1,
            $limit
        );
        $download_stats = array();
        foreach($ga->getResults() as $result){
            $download_stats[$result->getDate()] = array(
                'pageviews' => $result->getUniqueEvents()
            );
        }
        $data['downloads'] = $ga->getUniqueEvents(); 
        $ga->requestReportData(
            xxxxxxx,
            array('date'),
            array('pageviews','uniquepageviews','visitors'), 
            array('date'), 
            'pagePath==/test/'.$data['allPosters'][$i]['Path'], 
            date('Y-m-d', strtotime($data['allPosters'][$i]['Presentation_Date'])), 
            $expiry, 
            1,
            $limit
        );
    $stats = array();
        foreach($ga->getResults() as $result){
        $stats[] = array(
                'origdate' => $result->getDate(),
                'date' => date('j F Y', strtotime($result->getDate())),
                'pageviews' => $result->getPageviews(),
                'uniquepageviews' => $result->getUniquePageviews(),
                'visitors' => $result->getVisitors()
            );
        }
        $data['page_views'] = number_format($ga->getPageviews());
        $data['unique_page_views'] = number_format($ga->getUniquePageviews());
        $data['visitors'] = number_format($ga->getVisitors());
        $ga->requestReportData(
            xxxxxxxx,
            array('date'),
            array('pageviews'), 
            array('date'),
            'pagePath==/test/'.$data['allPosters'][$i]['Path'].'/pdf-emailed.php', 
            date('Y-m-d', strtotime($data['allPosters'][$i]['Presentation_Date'])), 
            $expiry, 
            1,
            $limit
        );
        $email_stats = array();
        foreach($ga->getResults() as $result){
            $email_stats[] = array(
                'origdate' => $result->getDate(),
                'date' => date('j F Y', strtotime($result->getDate())),
                'pageviews' => $result->getPageviews()
            );
        }
        $data['email_views'] = number_format($ga->getPageviews());
        $data['stats'] = $stats;
        $data['email_stats'] = $email_stats;
        $data['download_stats'] = $download_stats;


        $objWorkSheet = $objPHPExcel->createSheet($data['allPosters'][$i]['Identifier']);

        $objWorkSheet->SetCellValue('A1', 'Date');
        $objWorkSheet->SetCellValue('B1', 'Unique page views');
        $objWorkSheet->SetCellValue('C1', 'Page views');
        $objWorkSheet->SetCellValue('D1', 'Visitors');
        $objWorkSheet->SetCellValue('E1', 'Downloads');
        $objWorkSheet->SetCellValue('F1', 'e-mails');
        $objWorkSheet->SetCellValue('G1', 'SMS');

        $a = 2;
        foreach($stats as $stat){

            $objWorkSheet->SetCellValue('A'.$a, $stat['date']);
            $objWorkSheet->SetCellValue('B'.$a, intval($stat['uniquepageviews']));
            $objWorkSheet->SetCellValue('C'.$a, intval($stat['pageviews']));
            $objWorkSheet->SetCellValue('D'.$a, intval($stat['visitors']));


            $dd=$a;

        for($j=0;$j<=$total;$j++)
        {
                //$data['sms'][$j]['from_number']
                //$data['sms'][$j]['date'];
                $datetocompare=date('d-m-Y', strtotime($stat['date']));
                if((strtotime($datetocompare))==(strtotime($data['sms'][$j]['date'])) ){
                if(isset($data['sms'][$j]['numbers_of_sms'])){
                $objWorkSheet->SetCellValue('G'.$a, ($data['sms'][$j]['numbers_of_sms'] ));
                }else{
                $objWorkSheet->SetCellValue('G'.$a, 0);
                }
                }
        $dd++;
        }
            if(isset($download_stats[$stat['origdate']])){
                $objWorkSheet->SetCellValue('E'.$a, intval($download_stats[$stat['origdate']]['pageviews']));
            }else{
                $objWorkSheet->SetCellValue('E'.$a, 0);
            }
            if(isset($email_stats[$a-2])){
                $objWorkSheet->SetCellValue('F'.$a, intval($email_stats[$a-2]['pageviews']));
            }else{
                $objWorkSheet->SetCellValue('F'.$a, 0);
            }

            $a++;
        }

        $objWorkSheet->setTitle($data['allPosters'][$i]['Identifier']);

    $i++;
    }

}
    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
    $objWriter->save('uploads/allposters/'.md5($i).'.xlsx');
}
4

1 に答える 1

0

1.$i上のwhileループをこのforループに置き換えます

for($i = 0; $i < 150; ++$i){
...Preincrement is faster on php, dont ask me why. Do this on your other for loops as well.
}

2.ループチェーン中にこの関数を複数回呼び出します。

strtotime($data['allPosters'][$i]['Expiry_Date'])

一度だけ呼び出して、結果を変数に格納します。例:

$strt = strtotime($data['allPosters'][$i]['Expiry_Date']);

次に、すべてのオカレンスを変数に置き換えます。同様の冗長関数呼び出しでも同じことを行います。

3. ga-Objectがどのように機能するかはわかりませんが、ループがあります。

foreach($ga->getResults() as $result){
...
}

ほぼ真後ろに2回。アレイの場合は1回目、アレイ$download_statsの場合は2回目$stats、3回目は$email_stats

これらの2つのループを統合できるかどうか、またはコードを変更して、gesultを1回だけフェッチする必要があるかどうかを確認してください。

また、関数を呼び出します

$ga->getResults()

一度だけ、結果を変数に格納し、配列を反復処理します。たとえば、

$results = $ga->getResults();
foreach($results as $result){
...
}

可能な限り、関数呼び出しを減らすようにしてください。

ここのところ。私は私が助けることができると思います:)

于 2012-11-27T10:59:26.293 に答える