如何有效地运行一个没有';在万博环境中执行并不需要很长时间.


How do I efficiently run a PHP script that doesn't take forever to execute in wamp enviornemnt...?

我制作了一个脚本,它几乎从mysql数据库加载一个庞大的对象数组,然后从同一个mysql数据库中加载一个巨大(但较小)的对象列表。

我想使用PHP对每个列表进行迭代,以检查是否存在不规则行为。但每次我运行脚本都需要很长时间才能执行(到目前为止,我还没有看到它完成)。我有没有什么优化可以让它不需要这么长时间来执行。。。?第一个列表中大约有64150个条目,第二个列表中约有1748个条目。

这就是伪代码中的代码通常的样子。

// an array of size 64000 containing objects in the form of {"id": 1, "unique_id": "kqiweyu21a)_"}
$items_list = [];
// an array of size 5000 containing objects in the form of {"inventory: "a long string that might have the unique_id", "name": "SomeName", id": 1};
$user_list = [];

到目前为止,结果是即时的。。。但当我这样做的时候,执行起来需要很长时间,似乎永远不会结束。。。

foreach($items_list as $item)
{
    foreach($user_list as $user)
    {
        if(strpos($user["inventory"], $item["unique_id"]) !== false)
        {
            echo("Found a version of the item");
        }
    }
}

请注意,回声应该很少发生。。。。问题不在于MySQL,因为$items_list和$user_list数组几乎立即填充。。只有当我尝试迭代列表时,它才会开始花费很长时间。。。

对于130M次迭代,添加中断将有所帮助,尽管这种情况很少发生。。。

foreach($items_list as $item)
{
    foreach($user_list as $user)
    {
        if(strpos($user["inventory"], $item["unique_id"])){
            echo("Found a version of the item");
            break;
        }
    }
}

PHP 5.6的替代解决方案1:您也可以使用PTHREADS,并将您的大数组分割成块,将它们集中到线程中。。。有了休息,这肯定会改善它。

备选解决方案2:使用PHP7,阵列操作和循环的性能改进很大。

还要尝试在循环之前对数组进行排序。这取决于您所看到的内容,但通常情况下,如果找到条件,在数组之前排序会尽可能限制循环时间。

您的示例几乎不可能重现。您需要提供一个可以复制的例子,即如果只访问一个数组,那么两个循环将非常快地完成,即1-2秒。这意味着你搜索的字符串是千字节或更大(没有问题),或者在循环运行时发生了其他事情,即数据库访问或类似的事情。

您可以让SQL为您进行搜索。既然你不分享你需要的专栏,我就只拉我看到的那些。

SELECT i.unique_id, u.inventory
FROM items i, users u
WHERE LOCATE(i.unique_id, u inventory)