PHP数组包括性能

时间:2010-05-03 23:34:21

标签: php performance arrays include

如果我包含一个巨大的PHP数组,我可以期待什么类型的性能? 例如,假设我在“data.php”中有一个1GB的PHP数组,看起来像

$ data = array( // 1GB的数据 )

如果我在“header.php”中包含那个巨大的“data.php”文件,它在执行时会如何影响“header.php”的性能? 谢谢!

5 个答案:

答案 0 :(得分:5)

首先,您需要将页面的最大内存增加到超过1 GB,因为该阵列将被加载到每个页面的内存 。这意味着需要在每个脚本上读取和解析1GB的数据。最好的情况?这为每个页面加载增加了10秒以上。更有可能的是,页面根本不会加载。

将其存储在数据库中并根据需要进行查询。我无法想象在每个(或实际上是任何)页面上你需要该数组的整个数组(或其中的重要部分)。

答案 1 :(得分:3)

嗯......很多?

data.php将是巨大的,因此由于磁盘I / O而需要很长时间才能读取文件。然后它必须保持记忆,所以即使你没有内存限制,它也会影响性能。

要考虑的另一个瓶颈是max_execution_time限制。如果你在内存中需要1GB的数据,你最有可能做错了吗?你考虑过存储原始(填充)数据,每行一个元素然后只是请求该文件的某些特定字节吗?


示例(写入):

$values = array
(
    0 => '127.0.0.1', // 9 chars
    1 => '127.0.0.2', // 9 chars
    2 => '...', // 3 chars
    3 => '255.255.255.255', // 15 chars - this is the max in our set
);

foreach ($values as $key => $value)
{
    // lets pad each value to 15 bytes
    $values[$key] = str_pad($value, 15, ' ', STR_PAD_LEFT);
}

file_put_contents('./test.data', implode('', $values), LOCK_EX);

示例(阅读):

echo ltrim(file_get_contents('./test.data', false, null, 0 * 15, 15)); // 127.0.0.1
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 1 * 15, 15)); // 127.0.0.2
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 2 * 15, 15)); // ...
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 3 * 15, 15)); // 255.255.255.255

答案 2 :(得分:1)

只是在黑暗中拍摄,但看到你不能使用memcached等,你是否考虑使用基于磁盘的缓存,或者编写自己的类。因此,您将使用memcached-&gt; storeValue(或任何调用),而是调用您自己的函数,该函数将数据写入文件。这种错综复杂可能超出了这个问题的范围。另一种选择是使用已经编写过的东西,例如Zend Framework及其各种缓存类,它们应该允许你进行基于磁盘的缓存。其他框架可能有自己的缓存系统,可以写入磁盘(codeIgniter,CakePHP等)。 第三种方法是将缓存生成的数据放入mysql数据库中,这可能看起来有点疯狂,如果操作得当,它仍会以与其他任何缓存大致相同的方式为您提供速度提升。 当缓存其值得花费相当多的时间进行基准测试以确保您实际上通过这样做来消除瓶颈。

答案 3 :(得分:0)

取决于您的服务器,CPU,内存,网络服务器,硬盘等

但最有可能的是:这不是一个好主意。使用fread或其他东西来阅读文件要好得多。

答案 4 :(得分:0)

如果在data.php上存储1G数据,那么解析1GB文件需要很长时间,然后将数组的数据放入内存,需要时间和空间。服务器一次处理多个请求,即1GB乘以100到1000总内存,具体取决于您网站的每日视图。

为什么不尝试将其拆分为多个文件或使用数据库?甚至,创建一个后台服务,其中包含C中的硬编码1GB数据,PHP调用该服务来提取部分数据。