所以,需要帮助。
prePS - 代码有效,但在加载测试时效果不佳。
所以,php代码从用户那里得到一个文件并将其作为树部件保存在集群(4个节点)上。
所以,简单的代码就像。
$user_file = get_full_filename_of_userfile_from_post_array('user_file');
$fin = fopen($user_file,'rb');
$fout1 = fopen(get_uniq_name('p1'),'wb');
$fout2 = fopen(get_uniq_name('p2'),'wb');
$fout3 = fopen(get_uniq_name('p3'),'wb');
while ($part = fread($fin))
{
fwrite($fout1,get_1_part($part));
fwrite($fout2,get_2_part($part));
fwrite($fout3,get_3_part($part));
}
fclose($fin);
fclose($fout1);
fclose($fout2);
fclose($fout3);
$location = get_random_nodes(3,$array_of_existing_nodes);
foreach($location as $key => $node)//key 1..3
{
if(is_local_node($node)
{
save_local_file(get_part_file_name($key));
}
else
{
save_remote_file(get_part_file_name($key),$node);
}
}
//delete tmp files, logs,...etc
save_remote_file() - 使用cURL发送文件POST方法,如docs
$post_data = array(
'md5sum' => $md5sum,
'ctime' => $ctime,
.....
'file' => @.$upload_file_full_name,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, Config::get('connect_curl_timeout'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_URL, $URL.'/index.php');
curl_setopt($ch, CURLOPT_PORT, Config::get('NODES_PORT'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
因此,在测试期间,我上传了14000个文件,每个请求一个文件,每个节点10个请求(并行)。 PHP代码,检查文件并获得答案,然后在群集中的后台保存文件。 (是的,我知道为保存创建守护进程会很好 - 这是未来的任务)
所以,有时候,在后台节点上可能会有大约100个甚至200个php进程 (使用php-fpm函数)
ignore_user_abort(true);
set_time_limit(0);
session_commit();
if(function_exists('fastcgi_finish_request'))
fastcgi_finish_request();
一些计算。 14000个文件= 14000 * 3 = 42000个部分,从4个随机3个保存,因此25%部分保存在本地,75% - 远程 = 0.75 * 42000 = 31500远程保存
在测试期间,我在curl的所有节点上得到大约100个错误 errno = 26 errer =无法打开文件“##ІИP_zOж лЅHж“//它更奇怪,因为原始文件名 - 名称中大约有124个字符。例如
/var/vhosts/my.domains.com/www/process/r_5357bc33f3686_h1398258739.9968.758df087f8db9b340653ceb1abf160ae8512db03.chunk0.part2
在使用cURL的代码之前,我添加了检查file_exists($ upload_file_full_name) 和is_readable($ upload_file_full_name);如果不是 - 记录下来。
检查传递良好,但curl返回错误(从31500传递100次)
另外,添加代码,如果错误,请等待10秒,尝试againg,等待10secs,尝试,等待10次尝试。
总是所有如果首先尝试使用错误,所有下一次尝试也会出错,但是根据日志,同时另一个php处理保存其他文件的内容,好的通过curl发送一部分。
所以我不明白,我怎么能找到理由并修理它。