记录一个接一个地缓慢而不完整


records come one by one very slowly and incomplete

我的代码有问题此脚本将变量写入csv文件。我是通过HTTPGET获取参数的,问题是每个记录都很慢。它应该能够接收一批数千条记录。我还注意到它是不完整的,因为与从我的供应商下载的完整报告相比,它缺少了大约一半的记录。这是脚本:

<?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);
?>

我重写了两次,但问题仍然存在。这超出了我的知识范围,所以我希望有人能告诉我一个更好的方法。我的老板指责PHP,帮我证明他错了!

我认为有更好的方法可以做到这一点。试着先将所有数据放入一个数组中,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");

当请求从BulkSMS进入服务器时,每个请求都试图打开并写入同一个文件。

这些请求不会排队,也不会等待上一个请求完成后再启动另一个请求,这意味着当服务器发现文件已被前一个请求使用时,许多请求将失败。

对于这个应用程序,您最好将每个请求的数据存储在数据库(如SQLite)中,并根据需要编写单独的脚本来生成CSV文件。

我对SQLite不是特别熟悉,但我知道它很容易实现,而且似乎有很好的文档记录。

由于多个请求将同时到达,并发请求将尝试访问同一个输出文件并阻止其他请求访问。

正如我在评论中指出的,您应该使用一个不错的数据库。PostgreSQL或MySQL是开源数据库,对PHP有很好的支持。

根据我的经验,PostgreSQL是一个更坚实的数据库,在许多同时用户的情况下表现更好(尤其是在"写入"数据库时),尽管更难学习(它更"严格")。

MySQL更容易学习,而且可能足够了,这取决于请求/流量的总数。

PostgreSQL:http://www.postgresql.org

MySQL:http://www.mysql.com

请不要使用SQLite作为数据库,因为SQLite是一个基于文件的数据库,设计为单用户数据库,而不是用于客户端/服务器目的。尝试同时将其用于多个请求会给您带来与当前相同的问题

http://www.sqlite.org/whentouse.htmlSQLite的可扩展性如何?