【发布时间】:2016-10-17 01:18:25
【问题描述】:
我想从数千个预制的 sql 文件中提取数据。我有一个脚本可以在 PHP 中使用 Mysqli 驱动程序来完成我需要的工作,但它真的很慢,因为它一次只有一个 sql 文件。我修改了脚本以创建唯一的临时数据库名称,每个 sql 文件都加载到该名称中。数据被提取到存档数据库表中,然后临时数据库被转储。为了加快速度,我创建了一个由 4 个脚本组成的脚本,类似于下面的脚本,每个 for 循环都存储在它自己独特的 PHP 文件中(下面的代码仅用于快速演示正在发生的事情在 4 个单独的文件中),它们被设置为仅从源文件夹中获取 1/4 的文件。所有这些都完美运行,脚本运行,对文件处理的干扰为零。问题是我的性能提升似乎几乎为零。也许快了 10 秒 :( 我快速刷新了我的 PHPmyadmin 数据库列表页面,可以看到随时加载的 4 个不同的数据库,但我也注意到它看起来仍然或多或少地按顺序运行,因为数据库名称正在动态更改。我做了额外的步骤,为每个脚本创建一个唯一的用户,每个脚本都有自己的连接。没有改进。我可以让它与 mysqli / PHP 一起使用,还是我需要研究一些其他选项?我更喜欢这样做如果可以的话,全部使用 PHP(7.0 版)。我通过在浏览器中运行 PHP 脚本进行了测试。这是问题所在吗?我还没有编写任何代码来在命令行上执行它们并将它们设置为后台。一个最后一点,我的 mysql 数据库中的所有用户对连接等都没有限制。
$numbers = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20');
$numCount = count($numbers);
$a = '0';
$b = '1';
$c = '2';
$d = '3';
$rebuild = array();
echo"<br>";
for($a; $a <= $numCount; $a+=4){
if(array_key_exists($a, $numbers)){
echo $numbers[$a]."<br>";
}
}
echo "<br>";
for($b; $b <= $numCount; $b+=4){
if(array_key_exists($b, $numbers)){
echo $numbers[$b]."<br>";
}
}
echo "<br>";
for($c; $c <= $numCount; $c+=4){
if(array_key_exists($c, $numbers)){
echo $numbers[$c]."<br>";
}
}
echo "<br>";
for($d; $d <= $numCount; $d+=4){
if(array_key_exists($d, $numbers)){
echo $numbers[$d]."<br>";
}
}
【问题讨论】:
-
嗯...您的代码一个接一个地运行,它们不会并行运行。换句话说,第二个
for循环在之前的所有内容完成之前不会运行。对于线程,您需要继承Thread类。阅读:mullie.eu/parallel-processing-multi-tasking-php -
我的错...每个 for 循环都是它自己的文件...我只是将其格式化以快速显示想法。
-
哦,好的,我明白了。但无论如何,对于并行处理,您应该(“必须”)使用多个线程
-
好的,那么我是否走在正确的道路上?我有四个文件不会与其他文件处理等混淆...?
-
这是一种方式,但是在生产状态下,这将是非常浪费的。为 4 个并行任务(父 + 4 个子)使用 5 个连接不是这样做的方法,而是使用一个“父”进程来运行多个“子”进程而不会消耗更多的网络调用。这是线程的任务。有些人使用
curl()或fopen()来加载这些子脚本......即使这样可行,正确且被接受的方法是使用Thread子类。