0

コードに問題があります。このスクリプトは、変数を csv ファイルに書き込みます。HTTP GET 経由でパラメーターを取得しています。問題は、各レコードが 1 つずつ非常にゆっくりと取得されることです。何千ものレコードのバッチを取ることができるはずです。また、ベンダーからダウンロードした完全なレポートと比較すると、約半分のレコードが欠落しているため、不完全であることに気付きました。スクリプトは次のとおりです。

<?php

error_reporting(E_ALL ^ E_NOTICE);

// setting the default timezone to use.
date_default_timezone_set('America/New_York');

//setting a the CSV File
$fileDate = date("m_d_Y");
$filename = "./csv_archive/" . $fileDate . "_SmsReport.csv";

//Creating handle
$handle = fopen($filename, "a");
//$handle = fopen($directory.$filename, 'a')
//These are the main data field
$item1 = $_REQUEST['item1'];
$item2 = $_REQUEST['item2'];
$item3 = $_REQUEST['item3'];

$mydate = date("Y-m-d H:i:s");

$csvRow = $item2 . "," . $item1 . "," . $item3 . "," . $mydate . "\n";
//writing to csv file
// just making sure the function could wrtite to it
if (!$handle = fopen($filename, 'a')) {
    echo "Cannot open file ($filename)";
    exit;
}
//writing the data 
if (fwrite($handle, $csvRow) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}
fclose($handle);
?>

2回書き直しましたが、問題は解決しません。これは私の知識の範囲を超えているので、誰かがより良いアプローチを教えてくれることを願っています. 私の上司は PHP を非難しています。彼が間違っていることを証明するのを手伝ってください!

4

3 に答える 3

0

これを行うにはもっと良い方法があると思います。最初にすべてのデータを配列に入れてみてください。CSVファイルの各行はそれ自体が配列であり、次にそれを出力します。これは私がしばらく前に書いたいくつかのコードの例です:

class CSV_Output {

    public $data = array();
    public $deliminator;

    function __construct($data, $deliminator=",") {
        if (!is_array($data)) {
            throw new Exception('CSV_Output only accepts data as arrays');
        }
        $this->data = $data;
        $this->deliminator = $deliminator;
    }

    public function output() {
        foreach ($this->data as $row) {
            $quoted_data = array_map(array('CSV_Output', 'add_quotes'), $row);
            echo sprintf("%s\n", implode($this->deliminator, $quoted_data));
        }
    }

    public function headers($name) {
        header('Content-Type: application/csv');
        header("Content-disposition: attachment; filename={$name}.csv");
    }

    private function add_quotes($data) {
        $data = preg_replace('/"(.+)"/', '""$1""', $data);
        return sprintf('"%s"', $data);
    }

}   

// CONSTRUCT OUTPUT ARRAY
$CSV_Data = array(array(
    "Item 1",
    "Item 2",
    "ITem 3",
    "Date"
));

// Needs to loop through all your data..
for($i = 1; $i < (ARGUMENT_TO_STOP_LOOP) ; $i++) {

    $CSV_Data[] = array($_REQUEST['item1'], $_REQUEST['item2'], $_REQUEST['item3'], $_REQUEST['itemdate']);

}

$b = new CSV_Output($CSV_Data);
$b->output();
$b->headers("NAME_YOUR_FILE_HERE");
于 2013-02-08T00:01:30.003 に答える
0

複数のリクエストが同時に到着するため、同時リクエストは同じ出力ファイルにアクセスしようとし、他のリクエスト アクセスをブロックします。

コメントで指摘したように、適切なデータベースを使用する必要があります。PostgreSQL または MySQL はオープンソース データベースであり、PHP を適切にサポートしています。

私の経験では、PostgreSQL はより堅牢なデータベースであり、多くの同時ユーザー (特にデータベースへの「書き込み」時) でより優れたパフォーマンスを発揮しますが、学習はより困難 (より「厳密」) です。

リクエスト/トラフィックの総数によっては、MySQL の方が習得が容易であり、十分な場合があります。

PostgreSQL: http://www.postgresql.org

MySQL: http://www.mysql.com

SQLite は、クライアント/サーバー用ではなく、シングル ユーザー データベースとして設計されたファイルベースのデータベースであるため、SQLite をデータベースとして使用しないでください。同時に複数のリクエストに使用しようとすると、現在発生しているのと同じ種類の問題が発生します

http://www.sqlite.org/whentouse.html SQLite はどの程度スケーラブルですか?

于 2013-02-08T07:34:47.360 に答える
0

BulkSMS からサーバーにリクエストが届くと、各リクエストは同じファイルを開いて書き込みを試みます。

これらのリクエストはキューに入れられず、前のリクエストが完了するのを待たずに別のリクエストを開始します。つまり、ファイルが前のリクエストで既に使用されていることをサーバーが検出すると、多くのリクエストが失敗します。

このアプリケーションの場合、各リクエストからのデータを SQLite などのデータベースに格納し、必要に応じて CSV ファイルを生成する別のスクリプトを作成する方がはるかに優れています。

私は SQLite に特に精通していませんが、実装がかなり簡単で、十分に文書化されているように思われることは理解しています。

于 2013-02-08T01:05:07.030 に答える