2011-11-21 42 views
9

Khi tôi thực thi kịch bản email thông qua trình duyệt, lỗi trả về hết thời gian chờ được trả về (trừ khi tôi tăng thời gian thực thi, sau đó nó sẽ chạy ok, không phải giải pháp mà tôi đang tìm kiếm). Email được gửi tho, nhưng phải mất vĩnh viễn (trung bình 5 phút) để đến (tại hộp thư đến của tôi)!
(Xét rằng thông qua dòng lệnh nó hoạt động hoàn hảo Tôi nghĩ rằng SMTP tại php.ini được chắc chắn cũng được cấu hình.)mail() timeout issue

Vì vậy, đây là mã thực hiện theo yêu cầu trình duyệt:

<?php 
mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>'); 
?> 

và khi tôi chạy điều này giống nhau (có thực sự giống nhau không? Tôi bắt đầu nghi ngờ bản thân mình) mã thông qua dòng lệnh:

php -r "mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>');" 

nó hoạt động hoàn hảo! Kịch bản chạy, nó dừng lại và email đến ngay lập tức (2/3 giây).

Vì vậy, điều gì có thể gây ra sự khác biệt này và cách khắc phục sự cố? Bất kỳ ý tưởng?
Cảm ơn bạn trước.


[sửa] một số thông tin thêm:
- máy là cửa sổ
- máy chủ là localhost
- php.ini là như nhau cho cả hai trình duyệt và dụ cli


[edit2]
Cảm ơn tất cả các bạn đã cố gắng đoán đó là vấn đề. Tôi đặt câu hỏi hopping rằng ai đó đã có vấn đề trước và biết một cái gì đó cụ thể. Không có gì cụ thể cho thấy và không có đề xuất nào thực sự hiệu quả, tôi đã quyết định chấp nhận một đề xuất cho phép tôi đạt được nhiều kết luận hơn về vấn đề ... +1 Cho tất cả kiến ​​thức/suy nghĩ hữu ích của bạn (/ guesses) :-)

+2

Dòng lệnh và trình duyệt đang thực sự sử dụng hai tệp php.ini khác nhau. Bạn có thể muốn tìm kiếm php.ini và so sánh cài đặt của bạn – Patrick

+1

Điều đó không có ý nghĩa với tôi; Vì vậy, tôi đã kiểm tra: 'php --ini' trả về cùng một đường dẫn cho tệp cấu hình như trình duyệt. – acm

+0

Tôi giả sử sendmail_path cũng giống như vậy? – djdy

Trả lời

5

Tôi đã đưa ra giả thuyết một số couses, nhưng tôi sử dụng để Linux và trên cửa sổ tôi có thể olny đoán:

  1. php_cli và mod_php là 2 mã nhị phân khác nhau, mod_php có thể hơi bị hư hỏng
  2. php_cli và mod_php sử dụng 2 người dùng khác nhau, hồ sơ mạng của người dùng apache có thể là sự cố (dns, tường lửa, proxy ...)
  3. tập lệnh php của bạn ở vị trí "có vấn đề" hoặc chứa một số ký tự có vấn đề, nhưng tập lệnh cli của bạn là param, cố gắng thực hiện cùng một tập lệnh: php -fz: \ path \ tới \ php \ mail.php
+0

Xin chào, tôi đã thử thực thi tệp qua CLI như bạn đã nói và nó hoạt động như mong đợi, phân phối tức thì; Vì vậy, vấn đề không nên là tập tin kịch bản. – acm

+0

@andrematos để xác minh .1 bạn có thể cài đặt lại mod_php và để xác minh .2 bạn có thể thực hiện từ hệ thống apache/html_page ("php -fz: \ path \ to \ php \ mail.php") –

+0

Xin chào Ivan, tôi đã kiểm tra .2 và ngạc nhiên khi thấy nó mất nhiều nhất khi thực hiện mail() trực tiếp từ trình duyệt. Có thể nào thì những người dùng khác nhau đang được sử dụng? Ý tôi là, tất cả đều được cài đặt theo cùng một cách, cùng một lúc ... Vẫn không có ý nghĩa ... Cảm ơn anyway. – acm

2

Chỉ cần rõ ràng: Ví dụ php được sử dụng bởi tập lệnh giống với mã được sử dụng bởi mã dòng lệnh?

Nhiều máy chủ web sử dụng chuyển tiếp smtp, sẽ thu thập một loạt email và gửi tất cả cùng một lúc, vì vậy sẽ không có hành vi lạ nếu thư của bạn bị trễ. Tuy nhiên, thời gian thực hiện dài là không bình thường.

+0

Tôi đang chạy máy này từ máy của mình, vì vậy có, nó giống nhau. – acm

3

Với ghi chú này từ http://php.net/manual/en/function.mail.php, có vẻ như rất có khả năng rằng vấn đề là với MTA và không biết PHP trực tiếp:

Việc thực hiện Windows của mail() khác nhau bằng nhiều cách từ việc thực hiện Unix.Đầu tiên, nó không sử dụng nhị phân cục bộ để soạn thư nhưng chỉ hoạt động trên các ổ cắm trực tiếp có nghĩa là một MTA cần được lắng nghe trên ổ cắm mạng (có thể trên máy cục bộ hoặc máy từ xa).

Có lẽ nó có liên quan đến cách MTA phản hồi người dùng cụ thể hoặc quy tắc tường lửa người dùng cụ thể cho kết nối thư đi trên máy của bạn. Bạn có thể chạy dòng lệnh với tư cách là người dùng máy chủ web chứ không phải chính mình? Nếu vậy, điều đó có tạo lại vấn đề từ dòng lệnh không?

Làm cách nào để máy chủ web thực thi dòng lệnh PHP thay vì tệp PHP được phân tích cú pháp? (Ví dụ, có lẽ bạn có thể chạy một tập lệnh batch thông qua CGI.) Điều đó có giải quyết được vấn đề không?

(Xin lỗi vì đây là những dự đoán nhiều hơn câu trả lời rõ ràng.)

+0

Trott, cảm ơn vì nỗ lực của bạn, tuy nhiên như tôi đã giải thích cho Sekar (xem bình luận), tôi không nghĩ mình sẽ trải qua MTA. Tôi có thể có ý tưởng sai tho .. – acm

+0

@andrematos MTA là một thuật ngữ chung cho một cái gì đó xử lý chuyển thư. Bất kể, tôi vẫn sẽ kiểm tra các vấn đề tiềm năng liên quan đến người sử dụng và các quy tắc tường lửa vẫn còn. – Trott

2

Cố gắng đặt tên người dùng và mật khẩu thành id thư "Từ". để nó có thể xác thực và gửi thư nhanh chóng.

Bạn đã thử PHP mailer chưa?

Trong quan sát của tôi, nó sẽ gửi thư trong vài giây. Dưới đây ví dụ sẽ cung cấp cho bạn một cái nhìn nhanh chóng làm thế nào để sử dụng lớp thư php.

include "class.phpmailer.php"; 
$msg="Hello! This is a test..." 
$mail=new PHPMailer(); 
$email="[email protected]"; //person who receives your mail 
$mail->IsSMTP(); 
$mail->Host = "localhost"; 
$mail->SMTPAuth = true; 
$mail->Username = "[email protected]"; //your mail id 
$mail->Password = "sdfsd441"; //password for your mail id 
$mail->SetFrom('[email protected]', 'admin'); //from address 
$mail->AddAddress($email); 
$mail->Subject ="Test Mail"; 
$mail->Body = $msg; 
$mail->IsHTML(true); 
$mail->MsgHTML($msg); 
$mail->Send(); 

EDIT:
Trong PHP tay họ nói như thế này,

Việc thực hiện Windows của mail() khác nhau bằng nhiều cách từ việc thực hiện Unix. Đầu tiên, nó không sử dụng nhị phân cục bộ để soạn thư nhưng chỉ hoạt động trên các ổ cắm trực tiếp có nghĩa là một MTA cần được lắng nghe trên ổ cắm mạng (có thể trên máy cục bộ hoặc máy từ xa).

để có thể gây chậm trễ? Tôi nghĩ rằng điều này link có thể giúp bạn.

+0

Tôi đã thử cả PHPMailer và [Swift] (http://swiftmailer.org/) và hành vi này hoàn toàn giống nhau. – acm

+0

@andrematos kiểm tra phần chỉnh sửa của câu trả lời của tôi – VKGS

+0

Sekar, tôi đang kết nối với SMTP đích. Cài đặt của tôi là: SMTP: mail.example.com; FROM: [email protected]; ĐẾN: [email protected]; Vì vậy, tôi nghĩ rằng MTA không có vai trò ở đây. – acm

2

Trước khi bạn gửi thư trong kịch bản, hãy đảm bảo in ra các số ini_get() của các biến SMTP, smtp_portsendmail_from và chắc chắn rằng đây là các giá trị hoạt động. PHP chạy trên Windows không có lợi ích của việc gửi thư thông qua Sendmail, và bất cứ điều gì các nhà phát triển PHP rải sỏi với nhau cho nó là sơ sài tốt nhất.

Tôi luôn muốn thử nghiệm mail thông qua telnet để tôi có thể nhìn thấy nếu máy chủ là cho một lỗi mà không được thông qua trở lại đúng của khách hàng:

c:\> telnet smtp.domain.com 25 

220 smtp.domain.com ESMTP Postfix 
helo mailtest 
250 smtp.domain.com 
mail from: [email protected] 
250 2.1.0 Ok 
rcpt to: [email protected] 
250 2.1.5 Ok 
data 
354 End data with <CR><LF>.<CR><LF> 
from: [email protected] 
to: [email protected] 
subject: test mail 

this is a test message 
. 
250 2.0.0 Ok: queued as 42AD8364FE0E 
quit 
221 2.0.0 Bye 
2

đoán đầu tiên của tôi sẽ được rằng phiên bản trình duyệt gửi thư của bạn đã có ngữ cảnh hoặc kết nối sẵn sàng gửi. Ngược lại, việc thực thi trực tiếp (php -r) phải tải ngữ cảnh gửi thư.

Để xác nhận ý tưởng này, bạn có thể tạo vòng lặp để gửi 10 thư và kiểm tra các thư sau khi thư đầu tiên nhanh hơn nhiều.