0

我猜这个问题与PHP cli Memory usage optimization的主题相似,但是当发布者发现一个简单的编码错误时,这个问题就解决了。

我有一个连续运行的多线程 PHP (CLI) 应用程序。我正在尝试优化内存使用,因为每个线程使用的内存量限制了我在任何给定时间可以运行的线程数(因为我有有限的可用内存量)。经过一番调查,似乎每个线程进程使用的最小内存量约为 1.3MB。似乎有点高,但经过一番挖掘后,似乎 PHP 以大约 0.5MB 的块分配内存。我怀疑我的应用程序是否足够精简以使用不到 0.5MB,但我想尝试一下。如果可能的话,即使将占地面积减少 10-20% 也很好。

我正在考虑的一种选择是使用 APC 在内存中缓存一些数据。作为一种减少内存的技术,这似乎违反直觉,但目前我非常频繁地调用 MySQL 数据库来存储和检索数据。这是一个小例子:

<?php
function get_stored_token(){
    connect_db();

    $query_result = mysql_query("select token from tokens");
    if ($query_result == true){
           $query_result_array = mysql_fetch_row($query_result);
           $token = $query_result_array[0];
           unset($query_result, $query_result_array);
           return $token;
    }
    else {
           echo "Problem with query to get stored token!\n";
    }
}

以这种方式使用 MySQL 似乎有很多内存开销。这可以通过调用 来确认pmap -d PID | grep mysql,尤其libmysqlclient_r.so.16.0.0是在使用大量内存的地方。那么,也许一种在内存中缓存键/值对的简单技术实际上在内存方面会更轻?然而,我没有这方面的经验,所以我想在尝试更多地使用 APC(或其他一些缓存技术)之前听到关于这个想法的反馈。

任何其他关于如何在 PHP 中优化内存使用的想法都将受到欢迎!

4

2 回答 2

0

为什么你不使用 WHERE 术语?在 SQL 中,这部分确定将加载到 php 的行数,如果您正在寻找数据库中的第一个/最后一个 id,请为此使用 SQL 函数。一般来说,将 SQL 数据传递给 php 会消耗内存。

我认为,如果这是一个仅为所有用户选择而不是由用户修改的表,Memcahe 将对此有用。Memcash PHP

于 2013-02-14T13:03:33.580 回答
0

就个人而言,我会使用 memcached 进行数据库交互,这将大大提高线程处理能力。它可能不会减少整体内存使用量,但会提高执行速度,因此您应该能够更快地打开和关闭线程或更好地交叉调度线程,而不是所有事情都同时进行。
如果两个进程每个花费 1 分钟,现在每个进程花费 30 秒,那么这两个进程的内存使用量可以翻倍,并且每个进程只使用 30 秒,现在总体上仍然是一分钟,但执行速度更快。

于 2013-02-14T12:58:37.620 回答