如何解决php-imap中超过的最大执行时间


how do i solve the maximum execution time exceeded in php imap

我面临imap问题。事实上,我正在尝试获取一些主题词与数据库中关键字匹配的邮件。我使用的是一个可以正常工作的电子邮件id,但当使用不同的电子邮件id和相同的邮件时,它显示的最长执行时间超过了30秒。我还检查了gmail中的imap设置,它们都很好。。

同时也得到了这个错误。。"未定义的属性:stdClass::$subject"

<?php
// Create connection
$con=mysqli_connect("localhost",'root',"","project 6 sem");
// Check connection
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
//else
  //echo "Database connected..</br>";
?>
<?php
function Reply($prikey,$seckey,$submit3)
{
  $con=mysqli_connect("localhost",'root',"","project 6 sem");
  // Check connection
  if (mysqli_connect_errno())
  {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
    echo $prikey;
    echo $seckey;
   $result = mysqli_query($con,"SELECT * FROM data1 where pkey='$prikey' and skey='$seckey'");
  while($row = mysqli_fetch_array($result))
  {
       if($submit3 == "Positive")
       {
           $ans1 = $row['reply_yes'];
     //echo $ans1;
       }
       else if($submit3 == "Negative")
       {
           $ans1 =  $row['reply_no'];
     //echo $ans1;
       }
       echo "<br>";
       break;
    //header('location:'.$_SERVER['HTTP_REFERER']);
  }
   mysqli_close($con);
   return $ans1;
}
?>
<?php
$submit1 = NULL;
$submit2 = NULL;
if(isset($_POST['submit1']))
{
    $submit1 = ($_POST['submit1']);
}
//echo $submit1;
if(isset($_POST['submit2']))
{
    $submit2 = ($_POST['submit2']);
}
if(isset($_POST['select']))
{
    $select = ($_POST['select']);
}
$cbody=0;
$subject=0;
$hostname= '{imap.gmail.com:993/ssl}INBOX';
$username = 'xxxxx';
$password = 'XXXXX';
/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Tiriyo: ' . imap_last_error());
/* grab emails */
$emails = imap_search($inbox,'ALL');
$count = imap_num_msg($inbox);
$temp=array();
$m=0;
$a=0;
$sk=array();
$pk=array();
$subcount=0 ;
$subarray=array() ;
$msgcount=0;
$msgarray=array() ;
$ans1 = "";
$b=0;
  if($inbox)
  {
       $num = imap_num_msg($inbox);
       rsort($emails);
       $pk = array();
       foreach ($emails as $email_number)
      {
      $b++;
      echo "$b</br>";
         // ini_set('max_execution_time',50);
          $headers = imap_headerinfo($inbox, $email_number);    
          $sub_arr=explode(" ",$headers->subject);
          $count_sub=count($sub_arr);
          $pkey=array("Permission","permission",
                                          "Application","application",
                      "Complaint","complaint",
                                          "Enquiry","enquiry",
                      );
           $skey=array("lab","Lab","auditorium","Auditorium","IT Parking","leave");                                                   
          for($j=0;$j<$count_sub;$j++)
          {
                if($a==4)
                    break;
            for($r=0;$r<count($pkey);$r++)
            {       
                if($a==4)
                    break;
                  if($sub_arr[$j]==$pkey[$r])// Find the Primary key i.e from Subject
                  {
              $a++;
                          $sub=$headers->subject;
              $subarray[$subcount]=$headers->subject;
              $subcount+=1;
                          //echo "<b>$headers->subject</b></br>";
                          $message=imap_fetchbody($inbox,$email_number,1);
                          $msgarray[$msgcount]=imap_fetchbody($inbox,$email_number,1);
                          $body=explode(" ",$msgarray[$msgcount]);
              $msgcount+=1;
                          $count=count($body);

如果不能更改INI,可以在脚本中设置。这可能对单个脚本更安全,而不是对服务器上的所有脚本进行更改(就像INI更改一样)。

<?php
    set_time_limit ( 0 ); //0 = unlimited

有关详细信息:http://www.php.net/manual/en/function.set-time-limit.php

ANSWER您可以更改php.ini文件中的max_execution_time参数。斯坦达特今年30岁。如果您有访问权限,您可以将其更改为所需的值。

但是我认为这不是一个好主意(如果您不能更改php.ini文件)。

另一种方法是制作php文件,在其中您将获得用户电子邮件的数组。之后,您将创建ajax请求,该请求将发送每封电子邮件。因此,您的脚本只会工作几秒钟(或者,可能是几毫秒),但会工作很多次。我认为它更好(确切地说,如果你不能编辑php.ini,就像在我的情况下一样)。

如果您使用这种方法,这将允许您获得错误计数,例如,并使ui更加用户友好。例如,您可以跟踪已经发送的邮件数量。

我将添加一个简单的例子:

脚本,它将获取所有电子邮件并发送ajax请求:

foreach(email in emails) {
?>
    <script type="text/javascript">
        $.ajax({
            url: "send_rent_receipts.php",
            type: 'POST',
            data: 'mail='+email, // and other data
            success: function(data){
                count = count + 1;
                if(data == 'true')
                {   // add successfull sent
                    countSuccess = countSuccess + 1;
                }
                else
                {   // add error
                    arr.push(data); 
                    countErrors = countErrors + 1;
                }
                if(count == <?=$totalEntries;?>)
                {
                    $('#status').html('All mails had been sent!<br>Sent successfully: '+countSuccess+', Errors:  '+countErrors);
                    $("#status-image").attr( "src", "/images/thumb_up.png" );
                    for (key in arr) 
                    {
                        $('results').append(arr[key]+"<br>"); // handling errors
                    }
                }
                else
                {
                    $('#status').html('Process...<br><b>Total e-mail's: '+totalEntries+'</b><br>Sent successfully: '+countSuccess+', Errors: '+countErrors);
                }
            }
        });
    </script>
<?
}

将发送1封电子邮件的脚本:

// send 1 e-mail

简单:)

但是,您可以更改max_execution_time:)