代码之家  ›  专栏  ›  技术社区  ›  Dennis

phpscript在第4次睡眠后停止

  •  2
  • Dennis  · 技术社区  · 7 年前

    我有一个包含3500个用户数据的csv文件。我想将这些用户导入我的数据库,并向他们发送一封他们已注册的电子邮件。 我有以下代码:

    public function importUsers()
        {
            $this->load->model('perk/engagement_model');
            $this->load->model('user/users_model');
            $this->load->model('acl/aclUserRoles_model');
            $allengagements = $this->engagement_model->getAll();
    
            $filename = base_url() . 'assets/overdracht_users.csv';
            $file = fopen($filename, "r");
    
            $count = 0;
            $totalImported = 0;
            $importFails = array();
            $mailFails = array();
            while (($mappedData = fgetcsv($file, 10000, ";")) !== FALSE)
            {
                $count++;
                //Skip first line because it is the header
                if ($count > 1) {
                    if (!empty($mappedData[0])) {
                        $email = $mappedData[0];
    
                        $user = $this->users_model->getByEmail($email);
                        if (!$user) {
                            $user = new stdClass();
                            $user->email = $mappedData[0];
                            $user->first_name = $mappedData[1];
                            $user->family_name = $mappedData[2];
                            $user->address_line1 = $mappedData[3];
                            $user->address_postal_code = $mappedData[4];
                            $user->address_city = $mappedData[5];
                            $user->address_country = 'BE';
                            $user->volunteer_location = $mappedData[5];
                            $user->volunteer_location_max_distance = 50;
                            $user->phone = $mappedData[6];
                            if (!empty($mappedData[7])) {
                                $user->birthdate = $mappedData[7] . "-01-01 00:00:00";
                            } else {
                                $user->birthdate = null;
                            }
                            foreach ($allengagements as $eng) {
                                if ($eng->description == $mappedData[8]) {
                                    $engagement = $eng->engagement_id;
                                }
                            }
                            $user->engagement = $engagement;
                            if (!empty($mappedData[9])) {
                                $date_created = str_replace('/', '-', $mappedData[9]);
                                $date_created = date('Y-m-d H:i:s', strtotime($date_created));
                            } else {
                                $date_created = date('Y-m-d H:i:s');
                            }
                            $user->created_at = $date_created;
                            if (!empty($mappedData[10])) {
                                $date_login = str_replace('/', '-', $mappedData[10]);
                                $date_login = date('Y-m-d H:i:s', strtotime($date_login));
                            } else {
                                $date_login = null;
                            }
                            $user->last_login = $date_login;
                            $user->auth_level = 1;
                            $user->is_profile_public = 1;
                            $user->is_account_active = 1;
    
                            $combinedname = $mappedData[1] . $mappedData[2];
                            $username = str_replace(' ', '', $combinedname);
                            if (!$this->users_model->isUsernameExists($username)) {
                                $uniqueUsername = $username;
                            } else {
                                $counter = 1;
                                while ($this->users_model->isUsernameExists($username . $counter)) {
                                    $counter++;
                                }
                                $uniqueUsername = $username . $counter;
                            }
    
                            $user->username = $uniqueUsername;
    
                            $userid = $this->users_model->add($user);
                            if (!empty($userid)) {
                                $totalImported++;
                                //Add the user in the volunteer group in ACL
                                $aclData = [
                                    'userID'      => $userid,
                                    'roleID'      => 1,
                                    'addDate'     => date('Y-m-d H:i:s')
                                ];
                                $this->aclUserRoles_model->add($aclData);
    
                                //Registration mail to volunteer
                                $mail_data['name'] = $user->first_name . ' ' . $user->family_name;
                                $mail_data['username'] = $user->username;
    
                                $this->email->from(GENERAL_MAIL, 'Test');
                                $this->email->to($user->email);
                                //$this->email->bcc(GENERAL_MAIL);
                                $this->email->subject('Test');
                                $message = $this->load->view('mail/register/registration',$mail_data,TRUE);
                                $this->email->message($message);
    
                                $mailsent = $this->email->send();
                                if (!$mailsent) {
                                    array_push($mailFails, $mappedData);
                                }
                            } else {
                                array_push($importFails, $mappedData);
                            }
    
                            if ($count % 50 == 0) {
                                var_dump("count is " . $count);
                                var_dump("we are sleeping");
                                $min=20;
                                $max=40;
                                $randSleep = rand($min,$max);
                                sleep($randSleep);
                                var_dump("end of sleep (which is " . $randSleep . "seconds long)");
                            }
                            var_dump($user);
                        } else {
                            array_push($importFails, $mappedData);
                        }
                    }
                }
            }
            var_dump("Totale aantal rijen in het bestand (met header) : " . $count);
            var_dump("Totale aantal geimporteerd in de database : " . $totalImported);
            var_dump("Totale aantal gefaalde imports in de database : " . count($importFails));
            var_dump("Deze zijn gefailed : ");
            var_dump($importFails);
        }
    

    如果我不将用户添加到数据库中,或者发送邮件,并且只将var_dump()作为$user,我可以看到所有3500多个用户都是在php对象中正确创建的(因此它们应该能够正确插入)。

    问题是,我想在每发送50封邮件后的20到40秒之间添加一个随机睡眠。

    所以我开始做一些测试,在注释了insert和mail代码之后,我开始运行脚本,注意到在一段时间后(不是50),脚本会停止一点,然后继续运行,并在底部显示if case中的var_转储,它可以在screensho中显示。在下面。 第一个屏幕截图显示代码停止了一段时间(请注意,我只是var_转储东西,还没有在数据库中添加东西或发送电子邮件)。 first break

    此屏幕截图显示脚本达到200后的情况: 200 users

    从这一点开始,脚本就完全停止了。我试了三次,每次都在200点停止。 这里发生了什么??

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jan Myszkier    7 年前

    很可能您达到了默认的PHP限制。临时删除php默认限制:

    ini_set('memory_limit',-1);
    set_time_limit(0);
    

    然后,重新运行脚本并检查输出。

    可能有多种原因,但要知道确切原因,请使用启用错误输出。

    ini_set('display_errors',1);
    ini_set('display_startup_errors',1);
    

    如果限制不是问题,那么错误会告诉你更多。

    提示:使用日志仍然比向访问者输出错误要好,但我猜您是在您的计算机上测试这一点。