2009-12-26 28 views
8

Tôi có một kịch bản PHP mà giữ dừng lại ở cùng một chỗ mỗi lần và báo cáo trình duyệt của tôi:Đặt lại kết nối không mong muốn: Vấn đề về PHP hoặc Apache?

Kết nối đến máy chủ được thiết lập lại trong khi các trang được tải.

Tôi đã thử nghiệm điều này trên Firefox và IE, điều tương tự cũng xảy ra. Vì vậy, tôi đoán đây là một vấn đề cấu hình Apache/PHP. Dưới đây là một vài điều tôi đã thiết lập.

php.ini

max_execution_time = 300000 
max_input_time = 300000 
memory_limit = 256M 

Apache (httpd.conf)

Timeout 300000 
KeepAlive On 
MaxKeepAliveRequests 100 
KeepAliveTimeout 0 

Are đúng trên? Điều gì có thể gây ra điều này và tôi có thể thiết lập những gì?

Tôi đang chạy PHP (5.2.12.12) như là một mô-đun trên Apache (2.2) trên Windows server 2003.

Nó là rất có khả năng đây là một vấn đề Apache hay PHP như tất cả trình duyệt cũng làm như vậy. Tôi nghĩ rằng tập lệnh chạy cho chính xác 10 phút (600 giây).

+0

Kịch bản sẽ làm gì khi nó dừng lại? – cletus

+1

Tôi nghĩ rằng tại thời điểm nó dừng lại, nó thực hiện một kịch bản SQL bằng cách sử dụng tiện ích SQLCMD. Kịch bản này là khoảng 500 dòng và thats tất cả nó. Mỗi dòng là một cuộc gọi để chạy tập lệnh SQL bằng cách sử dụng SQLCMD và tôi tự hỏi tại sao nó không thành công vì nó đã làm điều này khoảng 300 trăm lần. Không có gì trong nhật ký btw quá !! :( – Abs

+0

"Không có gì trong nhật ký btw quá!" - bao gồm nhật ký của máy chủ web, php và sqlserver? – VolkerK

Trả lời

0

Tôi muốn thử thiết lập tất cả các tùy chọn báo cáo lỗi

-b trên hàng loạt lỗi hủy bỏ
-V severitylevel
error_level -m

và gửi tất cả các đầu ra cho khách hàng

<?php 
echo "<div>starting sql batch</div>\n<pre>"; flush(); 
passthru('sqlcmd -b -m -1 -V 11 -l 3 -E -S TYHSY-01 -d newtest201 -i "E:\PHP_N\M_Create_Log_SP.sql"'); 
echo '</pre>done.'; flush(); 
+0

Cảm ơn bạn đã nói trên, nhưng tôi nghĩ rằng tôi sẽ để lại ở trên cho các phương sách cuối cùng bởi vì những thay đổi sẽ đưa tôi một thời gian để thực hiện! Tôi vừa xác nhận đây không phải là một vấn đề về PHP vì dòng cuối cùng của tập lệnh PHP chỉ là một thông báo. Nghĩ duy nhất còn lại là Apache ?? – Abs

+0

Và máy chủ SQL (nhưng tôi không nghĩ rằng điều này có thể thiết lập lại một kết nối, phải không?). – Abs

+0

Thực sự khó để chạy kịch bản thử nghiệm này? Hoặc ít nhất là sao chép tập lệnh hiện có, thay thế exec() bằng passthru() và thêm hai dòng echo? Nó chỉ là một thử nghiệm. – VolkerK

1

Sự khác biệt giữa 2 cấu hình PHP thực sự là nguyên nhân gốc rễ của sự cố ở đầu của tôi. Ứng dụng của tôi dựa trên thư viện NuSOAP.

Trên cấu hình 1 với PHP 5.2, nó đã chạy tốt như phần mở rộng SOAP của PHP đã bị tắt.

Trên cấu hình 2 với PHP 5.3, nó đã cho lỗi "Kết nối đặt lại" khi tiện ích mở rộng SOAP của PHP được bật.

Tắt tiện ích mở rộng được phép để ứng dụng của tôi chạy trên PHP 5.3 mà không phải viết lại mọi thứ.

3

Tôi gặp sự cố tương tự - hóa ra apache2 đã bị phân đoạn. Nguyên nhân của segfault là php5-xdebug cho 5.3.2-1ubuntu4.14 trên Ubuntu 10.04 LTS. Xóa xdebug đã khắc phục sự cố.

+0

Tôi không có php5-xdebug cài đặt nhưng tôi đã có cùng một vấn đề lỗi phân đoạn apach2 (11). Có thể nguyên nhân là khác nhau và không chỉ php5-gỡ lỗi. –

+0

làm việc cho tôi, cảm ơn bạn rất nhiều! – slaver113

0

PHP của tôi bị phân đoạn mà không có bất kỳ thông tin bổ sung nào về nguyên nhân của nó. Hóa ra là hai lớp gọi phương thức magic __call() của nhau là vì cả hai đều không có phương thức được gọi. PHP chỉ lặp lại cho đến khi nó hết bộ nhớ. Nhưng nó đã không báo cáo thông báo "Kích thước bộ nhớ được phép của * byte cạn kiệt" thông thường, có lẽ vì các phương pháp là "ma thuật".

2

Tôi cũng có vấn đề này ngày hôm nay, hóa ra là một câu lệnh break; lạc trong mã PHP (bên ngoài bất kỳ chuyển đổi hoặc vòng lặp nào), trong một hàm có khối try...catch...finally.

Hình như PHP treo trong tình huống này:

<?php 

function a() 
{ 
    break; 

    try 
    { 
    } 
    catch (Exception $e) 
    { 
    } 
    finally 
    { 
    } 
} 

nầy cũng ở với PHP phiên bản 5.5.5.

+0

Có chính xác cùng một vấn đề, nhưng gây ra bởi một loại mã "lạ" khác như 'if ($ a []) $ b = $ c;'. Sau khi gỡ bỏ tất cả làm việc như bình thường. Có vẻ như trình phân tích cú pháp PHP đôi khi không khôi phục được từ mã sai. – karpy47

1

Tôi gặp sự cố trong một số trường hợp nhất định PHP 5.4 + eAccelerator = thiết lập lại kết nối. Không có đầu ra lỗi trong bất kỳ tệp nhật ký nào và nó chỉ xảy ra trên một số URL nhất định, điều này gây khó chẩn đoán. Hóa ra nó chỉ xảy ra đối với một số mã PHP nhất định/một số tệp PHP nhất định và do một số không tương thích với mã PHP và eAccelerator cụ thể. Giải pháp đơn giản nhất là để vô hiệu hóa eAccelerator cho rằng trang web cụ thể, bằng cách thêm dòng sau vào .htaccess tập tin

php_flag eaccelerator.enable 0

php_flag eaccelerator.optimizer 0

(hoặc dòng tương đương trong php.ini) :

eaccelerator.enable = "0"

eaccelerator.optimizer = "0"

1

Đó là một tuổi tôi biết, nhưng vì tôi không thể tìm ra giải pháp cho vấn đề của mình ở bất cứ đâu và tôi đã sửa nó, tôi sẽ chia sẻ kinh nghiệm của mình. Nguyên nhân chính của sự cố của tôi là cuộc gọi chức năng file_exists().
Tệp thực sự tồn tại, nhưng vì lý do nào đó, dấu gạch chéo thêm vào vị trí tệp ("//") thường hoạt động trên trình duyệt thông thường, có vẻ không hoạt động trong PHP. Có lẽ vấn đề của bạn liên quan đến một cái gì đó tương tự. Hy vọng điều này sẽ giúp một ai đó!

Các vấn đề liên quan