我有一些我需要通过Cron点击的网站。我不想创建20个cron作业,所以我创建了一个在我的开发服务器上点击一个PHP脚本的作业。它看起来像这样:
<?php //This script will send out directives to send [some] emails to [people]
//Start new init with $ch1, $ch2, $ch3 etc
$ch1 = curl_init();
$ch2 = curl_init();
$ch3 = curl_init();
$ch4 = curl_init();
$ch5 = curl_init();
$ch6 = curl_init();
$ch7 = curl_init();
$ch8 = curl_init();
$ch9 = curl_init();
$ch10 = curl_init();
$ch11 = curl_init();
$ch12 = curl_init();
$ch13 = curl_init();
$ch14 = curl_init();
$ch15 = curl_init();
$ch16 = curl_init();
$ch17 = curl_init();
$ch18 = curl_init();
$ch19 = curl_init();
//Set URL and options
curl_setopt($ch1, CURLOPT_URL, 'http://site1.com/?key=mykey');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_URL, 'http://site2.com/?key=mykey');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch3, CURLOPT_URL, 'http://site3.com/?key=mykey');
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch4, CURLOPT_URL, 'http://site4.com/?key=mykey');
curl_setopt($ch4, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch5, CURLOPT_URL, 'http://site5.com/?key=mykey');
curl_setopt($ch5, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch6, CURLOPT_URL, 'http://site6.com/?key=mykey');
curl_setopt($ch6, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch7, CURLOPT_URL, 'http://site7.com/?key=mykey');
curl_setopt($ch7, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch8, CURLOPT_URL, 'http://site8.com/?key=mykey');
curl_setopt($ch8, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch9, CURLOPT_URL, 'http://site9.com/?key=mykey');
curl_setopt($ch9, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch10, CURLOPT_URL, 'http://site10.com/?key=mykey');
curl_setopt($ch10, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch11, CURLOPT_URL, 'http://site11.com/?key=mykey');
curl_setopt($ch11, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch12, CURLOPT_URL, 'http://site12.com/?key=mykey');
curl_setopt($ch12, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch13, CURLOPT_URL, 'http://site13.com/?key=mykey');
curl_setopt($ch13, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch14, CURLOPT_URL, 'http://site14.com/?key=mykey');
curl_setopt($ch14, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch15, CURLOPT_URL, 'http://site15.com/?key=mykey');
curl_setopt($ch15, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch16, CURLOPT_URL, 'http://site16.com/?key=mykey');
curl_setopt($ch16, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch17, CURLOPT_URL, 'http://site17.com/?key=mykey');
curl_setopt($ch17, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch18, CURLOPT_URL, 'http://site18.com/?key=mykey');
curl_setopt($ch18, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch19, CURLOPT_URL, 'http://site19.com/?key=mykey');
curl_setopt($ch19, CURLOPT_RETURNTRANSFER, 1);
//Create multiple cURL handlers
$mh = curl_multi_init();
//Add the handles
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
curl_multi_add_handle($mh, $ch3);
curl_multi_add_handle($mh, $ch4);
curl_multi_add_handle($mh, $ch5);
curl_multi_add_handle($mh, $ch6);
curl_multi_add_handle($mh, $ch7);
curl_multi_add_handle($mh, $ch8);
curl_multi_add_handle($mh, $ch9);
curl_multi_add_handle($mh, $ch10);
curl_multi_add_handle($mh, $ch11);
curl_multi_add_handle($mh, $ch12);
curl_multi_add_handle($mh, $ch13);
curl_multi_add_handle($mh, $ch14);
curl_multi_add_handle($mh, $ch15);
curl_multi_add_handle($mh, $ch16);
curl_multi_add_handle($mh, $ch17);
curl_multi_add_handle($mh, $ch18);
curl_multi_add_handle($mh, $ch19);
$active = null;
//Execute handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//Error Report
echo 'Errors for <strong>site1.com</strong>: '.curl_error($ch1).'<br />';
echo 'Error Count for site1.com: <strong>'.curl_errno($ch1).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site2.com</strong>: '.curl_error($ch2).'<br />';
echo 'Error Count for site2.com: <strong>'.curl_errno($ch2).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site3.com</strong>: '.curl_error($ch3).'<br />';
echo 'Error Count for site3.com: <strong>'.curl_errno($ch3).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site4.com</strong>: '.curl_error($ch4).'<br />';
echo 'Error Count for site4.com: <strong>'.curl_errno($ch4).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site5.com</strong>: '.curl_error($ch5).'<br />';
echo 'Error Count for site5.com: <strong>'.curl_errno($ch5).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site6.com</strong>: '.curl_error($ch6).'<br />';
echo 'Error Count for site6.com: <strong>'.curl_errno($ch6).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site7.com</strong>: '.curl_error($ch7).'<br />';
echo 'Error Count for site7.com: <strong>'.curl_errno($ch7).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site8.com</strong>: '.curl_error($ch8).'<br />';
echo 'Error Count for site8.com: <strong>'.curl_errno($ch8).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site9.com</strong>: '.curl_error($ch9).'<br />';
echo 'Error Count for site9.com: <strong>'.curl_errno($ch9).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site10.com</strong>: '.curl_error($ch10).'<br />';
echo 'Error Count for site10.com: <strong>'.curl_errno($ch10).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site11.com</strong>: '.curl_error($ch11).'<br />';
echo 'Error Count for site11.com: <strong>'.curl_errno($ch11).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site12.com.au</strong>: '.curl_error($ch12).'<br />';
echo 'Error Count for site12.com.au: <strong>'.curl_errno($ch12).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site13.com</strong>: '.curl_error($ch13).'<br />';
echo 'Error Count for site13.com: <strong>'.curl_errno($ch13).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site14.com</strong>: '.curl_error($ch14).'<br />';
echo 'Error Count for site14.com: <strong>'.curl_errno($ch14).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site15.com</strong>: '.curl_error($ch15).'<br />';
echo 'Error Count for site15.com: <strong>'.curl_errno($ch15).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site16.com</strong>: '.curl_error($ch16).'<br />';
echo 'Error Count for site16.com: <strong>'.curl_errno($ch16).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site17.com</strong>: '.curl_error($ch17).'<br />';
echo 'Error Count for site17.com: <strong>'.curl_errno($ch17).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site18.com</strong>: '.curl_error($ch18).'<br />';
echo 'Error Count for site18.com: <strong>'.curl_errno($ch18).'</strong><br /><br />';
echo '<hr />';
echo 'Errors for <strong>site19.com</strong>: '.curl_error($ch19).'<br />';
echo 'Error Count for site19.com: <strong>'.curl_errno($ch19).'</strong><br /><br />';
//Close handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_remove_handle($mh, $ch3);
curl_multi_remove_handle($mh, $ch4);
curl_multi_remove_handle($mh, $ch5);
curl_multi_remove_handle($mh, $ch6);
curl_multi_remove_handle($mh, $ch7);
curl_multi_remove_handle($mh, $ch8);
curl_multi_remove_handle($mh, $ch9);
curl_multi_remove_handle($mh, $ch10);
curl_multi_remove_handle($mh, $ch11);
curl_multi_remove_handle($mh, $ch12);
curl_multi_remove_handle($mh, $ch13);
curl_multi_remove_handle($mh, $ch14);
curl_multi_remove_handle($mh, $ch15);
curl_multi_remove_handle($mh, $ch16);
curl_multi_remove_handle($mh, $ch17);
curl_multi_remove_handle($mh, $ch18);
curl_multi_remove_handle($mh, $ch19);
curl_multi_close($mh);
echo 'Script Executed Successfully!'; // Just shows me the file is actually loading to completion
?>
这些网站中的每一个都是为处理查询字符串而构建的WordPress。
<?php
if( $_GET['key'] == 'mykey'){
$network_array = wp_get_sites();
foreach( $network_array as $site ){
$temp = file_get_contents('http://'.$site['domain'].'/page-with-mail-script/?runkey=AnotherKey');
$temp = '';
}
}
?>
此时,我们的想法是使用wp_get_sites()
函数来获取该特定网络上所有站点的数组(这些都是wordpress多站点)。我使用file_get_contents()
使用查询字符串访问该站点以在该页面上运行脚本。
该页面模板为要发送的电子邮件列表运行wp_query,并使用Mandrill by MailChimp为其发送一个“联系人”列表。这是该文件:
get_header();
do_action( 'genesis_before_content_sidebar_wrap' );
?>
<div id="content-sidebar-wrap">
<?php do_action( 'genesis_before_content' ); ?>
<div id="content" class="hfeed">
<?php
if($_GET['key'] == 'AnotherKey'){
#Start up contact query
$contact_query = new WP_Query(array('post_type' => 'contacts', 'posts_per_page' => '-1'));
$invite_query = new WP_Query(array('post_type' => 'invites', 'posts_per_page' => '-1'));
#Let's use the get_posts method for a foreach loop option
$contacts = $contact_query->get_posts();
$invites = $invite_query->get_posts();
#Loop through the contacts
foreach( $contacts as $contact ){
$email_status = 'skipped.';
#Initiate the custom fields
$contact_custom = get_post_custom($contact->ID);
#Return custom fields as variables
$email_address = $contact_custom['email_address'][0]; //Where do we reach them?
$email_number = $contact_custom['email_number'][0]; //Which email do they need?
$last_email_date = $contact_custom['last_email_date'][0]; //When did they last get one?
//$phone_number = $contact_custom['phone_number']; // Phone Number (NOT USED 9-23-14)
#Let's get some other variables we need
$today = time();
$remove_me_link = '<a href="'.site_url().'/remove-me?email='.urlencode($email_address).'" target="_blank">Get Removed From This List</a>';
#If EMAIL_NUMBER is GREATER than zero, continue, otherwise skip (this is set to a negative value to remove them from the list)
if( $email_number > 0 ){
#We need to find the email to send them.
foreach( $invites as $invite ){
#Initiate the custom fields
$invite_custom = get_post_custom($invite->ID);
#Return custom fields as variables
$invite_number = $invite_custom['invite_number'][0]; //Which email is this?
$invite_delay = $invite_custom['invite_delay'][0]; //How long should we wait to send this one?
$forgiving_delay = $invite_delay * 86400; //Ex. 1, or 7 times a unix day
$forgiving_delay = $forgiving_delay - 28800; // Remove 8 hours from the timeframe, this allows some leway in server time discrepancies
$publish_date = get_the_time('U', $contact->ID); //Convert publish date to unix
#See if the invite number matches their required email number
if( $invite_number == $email_number ){
#It does! Now see if the proper delay has been met
if( empty($last_email_date) || $last_email_date == '' || $last_email_date < 9999 ){ //This means they're new. We need to wait until the delay after the PUBLISH date for this.
if($today - $publish_date > $forgiving_delay){
$to = $email_address;
$subject = $invite->post_title;
$message = '
<html>
<head>
<title>'.$invite->post_title.'</title>
</head>
<body>
<p>'.$invite->post_content.'</p>
<br />
<br />
<p style="font-size: 10px;">This email was sent to you on behalf of <strong>'.$gv->organization.'</strong>, <strong>'.$gv->address.', '.$gv->city.' '.$gv->state.' '.$gv->zip_code.'</strong><br />If you have any questions, please send an email to <strong>'.$gv->author_email.'</strong> or call <strong>'.$gv->phone.'</strong>.</p>
<p style="font-size: 10px;">Don\'t want to see this? '.$remove_me_link.'</p>
</body>
</html>';
$message = str_replace('{contact_name}', $contact->post_title, $message);
$message = str_replace('{contact_email}', $email_address, $message);
$message = str_replace('{review_engine_url}', str_replace(array('http://', 'https://'), '', site_url()), $message);
$message = str_replace('{google_url}', $gv->google_plus, $message);
$message = str_replace('{yelp_url}', $gv->yelp, $message);
$message = str_replace('{facebook_url}', $gv->like_box, $message);
$message = str_replace('{review_site_one_url}', $gv->review_site_one_url, $message);
$message = str_replace('{review_site_two_url}', $gv->review_site_two_url, $message);
$message = str_replace('{review_site_three_url}', $gv->review_site_three_url, $message);
$message = str_replace('{review_site_four_url}', $gv->review_site_four_url, $message);
$message = str_replace('{superpages_url}', $gv->super_pages, $message);
$message = nl2br($message);
//$from = 'mailer@'.str_replace(array('http://', 'https://'), '', site_url());
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
//$headers .= 'From: '.$from;
$mail = wpMandrill::mail($to, $subject, $message, $headers);
#If it succeeded, let's update post data in the contact
if( $mail ){
update_post_meta($contact->ID, 'email_number', $email_number + 1);
update_post_meta($contact->ID, 'last_email_date', $today);
$email_status = 'Good!';
} else {
$email_status = 'Bad.';
}
echo $contact->post_title.': <strong>'.$email_status.'</strong><br />';
}
} else {
if($today - $last_email_date > $forgiving_delay){ // This means they've gotten emails before, proceed as normal
//trm_send_invite_email(); //WHAT DID THIS DO?
$to = $email_address;
$subject = $invite->post_title;
$message = '
<html>
<head>
<title>'.$invite->post_title.'</title>
</head>
<body>
<p>'.$invite->post_content.'</p>
<br />
<br />
<p style="font-size: 10px;">This email was sent to you on behalf of <strong>'.$gv->organization.'</strong>: <strong>'.$gv->address.', '.$gv->city.' '.$gv->state.' '.$gv->zip_code.'</strong><br />If you have any questions, please send an email to <strong>'.$gv->author_email.'</strong> or call <strong>'.$gv->phone.'</strong>.</p>
<p style="font-size: 10px;">Don\'t want to see this? '.$remove_me_link.'</p>
</body>
</html>';
$message = str_replace('{contact_name}', $contact->post_title, $message);
$message = str_replace('{contact_email}', $email_address, $message);
$message = str_replace('{review_engine_url}', str_replace(array('http://', 'https://'), '', site_url()), $message);
$message = str_replace('{google_url}', $gv->google_plus, $message);
$message = str_replace('{yelp_url}', $gv->yelp, $message);
$message = str_replace('{facebook_url}', $gv->like_box, $message);
$message = str_replace('{review_site_one_url}', $gv->review_site_one_url, $message);
$message = str_replace('{review_site_two_url}', $gv->review_site_two_url, $message);
$message = str_replace('{review_site_three_url}', $gv->review_site_three_url, $message);
$message = str_replace('{review_site_four_url}', $gv->review_site_four_url, $message);
$message = str_replace('{superpages_url}', $gv->super_pages, $message);
$message = nl2br($message);
//$from = $gv->organization.'@'.str_replace(array('http://', 'http:s//'), '', site_url());
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
//$headers .= 'From: '.$from;
$mail = wpMandrill::mail($to, $subject, $message, $headers);
#If it succeeded, let's update post data in the contact
if( $mail ){
update_post_meta($contact->ID, 'email_number', $email_number + 1);
update_post_meta($contact->ID, 'last_email_date', $today);
} else {
$email_status = 'Bad.';
}
}
echo $contact->post_title.': <strong>'.$email_status.'</strong><br />';
}
}
} //End Invite Loop
}
} //End Contact loop
} else {
echo '<h1 class="entry-title">Hold on, partner!</h1>';
echo '<p>You\'re not supposed to be here!</p>';
} ?>
</div><!-- end #content -->
<?php do_action( 'genesis_after_content' ); ?>
<div style="clear:both;"></div>
</div><!-- end #content-sidebar-wrap -->
<?php
do_action( 'genesis_after_content_sidebar_wrap' );
get_footer();
我收到来自Cron守护程序的通知,说通过在第一个被cron命中的文件中显示“Script Executed Succesfully”回显来执行该脚本。
问题是,电子邮件似乎是在前几个网站上发送的,但其余部分保持不变,如“联系人”帖子类型中的自定义字段所示。
脚本超时吗?被杀?我是不是应该在一个文件中访问每个站点,而是单独转到每个站点?或者我应该使用curl_init()
,curl_setopt
,然后在转到下一个之前删除cURL?
答案 0 :(得分:1)
我们试图做几乎完全相同的事情(Wordpress Multisite电子邮件)并遇到内置PHPMailer类的超时问题(wp_mail()函数是它的包装器)。我的CRON脚本总会收到100封电子邮件,然后就死了。该脚本将回应它已完成发送,但我只会收到前100个。有趣的是,当我在同一台服务器上的两个Wordpress站点之间拆分时,我会在每个站点上发送50封电子邮件。我不熟悉Mandrill,但我想知道你是否遇到了速率限制,在很短的时间内发起了太多的电子邮件发送。
这是两次执行mail()函数吗?
或许改变这个:
$mail = wpMandrill::mail($to, $subject, $message, $headers);
#If it succeeded, let's update post data in the contact
if( $mail ){
update_post_meta($contact->ID, 'email_number', $email_number + 1);
对此:
if( $mail = wpMandrill::mail($to, $subject, $message, $headers) ) {
update_post_meta($contact->ID, 'email_number', $email_number + 1);
答案 1 :(得分:0)
为什么要为此打开19个独立的连接处理程序?我不知道这是否会导致您所描述的问题,但肯定不会有所帮助。