我有一个三个PHP脚本,每天在服务器中运行两个作为单独的cron作业。 第一个脚本(get_products.php),对外部服务器进行curl调用以获取所有产品数据并将该数据存储在数据库中。请注意,每天约有10000种产品并且每天都在增加。
在第二个脚本(find_related.php)中,从第一个脚本存储的数据库中选择产品,执行一些操作并将操作数据存储在另一个数据库中。每个产品有10行,因此在这个数据库中有大约100000行。此脚本以cron身份运行。有时脚本没有完全执行,这就是为什么实际和期望的结果不会存储在数据库中。我在脚本中包含了这行代码:ini_set('max_execution_time','3600');
但它不起作用。
以下是此脚本中完成的过程: 通常任务是根据标签找到10个相关产品。我的数据库中存储了大约10300个产品。每次查询都会获取一个产品及其标签,并尝试随机查找一个标记有相同标签的产品作为主要产品,并将相关产品数据存储到另一个数据库中以获取第三个脚本。每个标签只允许使用一种产品。如果找不到总共10个相关产品,则随机从另一个名为bestseller_products的数据库中获取产品。 这是我的代码:
$get_all_products = mysql_query('SELECT * FROM store_products');
while($get_products_sql_res = mysql_fetch_array($get_all_products)){
$related_products = array();
$tags = explode(",",$get_products_sql_res['product_tags']);
$product_id = $get_products_sql_res['product_id'];
$product_handle = $get_products_sql_res['product_handle'];
$get_products_sql = mysql_query('SELECT * FROM related_products WHERE product_handle="'.$product_handle.'"');
if (mysql_num_rows($get_products_sql)==0)
{
$count = 0;
foreach($tags as $t){
$get_related_products_sql = mysql_query("SELECT product_handle, product_title, product_image FROM store_products WHERE product_tags like '%".$t."%' AND product_id != '".$product_id."' ORDER BY RAND()");
if(!$get_related_products_sql){
continue;
}
while($get_related_products = mysql_fetch_array($get_related_products_sql) ){
$related_product_title = mysql_real_escape_string($get_related_products['product_title']);
$found = false;
foreach($related_products as $r){
if($r['handle'] == $get_related_products['product_handle']){
$found = true;
break;
}
}
if($found == false){
$related_products[$count]['handle'] = $get_related_products['product_handle'];
mysql_query("INSERT INTO related_products (product_handle, product_id, related_product_title, related_product_image, related_product_handle) VALUES ('$product_handle','$product_id','$related_product_title', '$get_related_products[2]', '$get_related_products[0]')");
$count = $count + 1;
break;
}
}
}
if($count < 10){
$bestseller_products = mysql_query("SELECT product_handle, product_title, product_image FROM bestseller_products WHERE product_id != '".$product_id."' ORDER BY RAND() LIMIT 10");
while($bestseller_products_sql_res = mysql_fetch_array($bestseller_products)){
if($count < 10){
$found = false;
$related_product_title = mysql_real_escape_string($bestseller_products_sql_res['product_title']);
$related_product_handle = $bestseller_products_sql_res['product_handle'];
foreach($related_products as $r){
if($r['handle'] == $related_product_handle){
$found = true;
break;
}
}
if($found == false){
$related_product_image = $bestseller_products_sql_res['product_image'];
mysql_query("INSERT INTO related_products (product_handle, product_id, related_product_title, related_product_image, related_product_handle) VALUES ('$product_handle','$product_id','$related_product_title', '$related_product_image', '$related_product_handle')");
$count = $count + 1;
}
}
}
}
}
}
第三个脚本(create_metafields.php),使用第二个脚本创建的数据在外部服务器中创建了元字段。同样的问题出现在第二个脚本中。
所以我想将第二个脚本分成几部分。我的意思是,不要在一次通话中处理所有10000种产品,而是想运行类似的部件(1-500,501-1000,1001-1500,..)。但是不想创建单独的cron作业。如果有人有解决方案,请建议。我真的需要弄明白。
提前致谢!