2010-04-23 24 views
5

Tôi đang chạy một nhập khẩu lớn để cơ sở dữ liệu của tôi (khoảng 200k hồ sơ) và tôi đang gặp một vấn đề nghiêm trọng với thời gian nhập khẩu kịch bản của tôi ra. Tôi đã sử dụng điện thoại di động của tôi như là một chiếc đồng hồ dừng lại và thấy rằng nó lần ra chính xác 45 giây mỗi pass (lỗi máy chủ nội bộ) ... nó chỉ có khoảng 200 bản ghi tại một thời điểm, đôi khi ít hơn. Tôi đã quét phpinfo của mình() và không có gì được đặt thành 45 giây; vì vậy, tôi không biết gì về lý do tại sao nó sẽ làm điều này.PHP Script Times ra sau 45 giây

max_execution_time của tôi được đặt thành 5 phút và max_input_time của tôi được đặt thành 60 giây. Tôi cũng đã thử thiết lập set_time_limit (0); ignore_user_abort (1); ở đầu trang của tôi nhưng nó không hoạt động.

Cũng có thể hữu ích khi lưu ý rằng tệp lỗi của tôi đọc: "Kết thúc tiêu đề tập lệnh sớm" dưới dạng lỗi thực thi.

Bất kỳ hỗ trợ nào được đánh giá cao.

+0

bất kỳ thông báo lỗi nào? bạn đã kích hoạt error_reporting (-1), phải không? – Gordon

+0

Chỉ cần thêm rằng dưới dạng chỉnh sửa khi bạn đăng nội dung này :) Một thông báo lỗi: "Kết thúc sớm tiêu đề tập lệnh" –

+0

Có thể trùng lặp của [Đầu cuối tập lệnh cuối: index.php, mod \ _fcgid: đọc hết thời gian chờ trong 61 giây] (http://stackoverflow.com/questions/14488567/premature-end-of-script-headers-index-php-mod-fcgid-read-data-timeout-in-61-s) – kenorb

Trả lời

0

Hoàn toàn có thể là bạn đang đạt đến giới hạn tài nguyên được thực thi trên máy chủ của mình, đặc biệt nếu máy chủ không nằm trong tầm kiểm soát của bạn.

Giả sử đó là một số loại máy chủ Linux, bạn có thể thấy giới hạn tài nguyên của mình với ulimit -a trên dòng lệnh. ulimit -t cũng sẽ chỉ cho bạn thấy giới hạn về thời gian cpu.

Nếu CPU của bạn bị giới hạn, bạn có thể phải xử lý việc nhập theo lô.

+0

Tôi không nghĩ rằng nó là một giới hạn tài nguyên ... kịch bản là thời gian ra chính xác 45 giây .... nếu đó là điều loại bộ nhớ sẽ không phải là thời gian rất không phù hợp? –

+0

Bạn có thể đặt giới hạn cho những thứ khác ngoài bộ nhớ và máy chủ lưu trữ sẽ thường hạn chế thời gian CPU để ngăn chặn các quá trình chạy trốn. Trong trường hợp như vậy, nó sẽ hết thời gian gần đúng với giới hạn. Hãy thử 'ulimit -t' và xem những gì bạn nhận được. – zombat

+0

@Dave: Cũng có RLimitCPU của Apache: http://httpd.apache.org/docs/2.2/mod/core.html#rlimitcpu –

0

Trước tiên, bạn nên chạy tập lệnh từ dòng lệnh nếu quá trình này mất chút thời gian. Ít nhất trình duyệt của bạn sẽ hết thời gian chờ sau 2 phút nếu nó không nhận được nội dung nào.

php -f filename.php 

Nhưng nếu bạn cần chạy nó từ trình duyệt, hãy thử thêm tiêu đề ("Kiểu nội dung: văn bản/html") trước khi nhập.

Nếu bạn đang ở trên một máy chủ chia sẻ, có thể có những hạn chế đối với hệ thống khi bất kỳ truy vấn và/hoặc tập lệnh chạy dài nào sẽ tự động bị giết sau một khoảng thời gian nhất định. Những hạn chế này thường được nới lỏng cho các tập lệnh không chạy trên web. Do đó, chạy nó từ dòng lệnh sẽ giúp ích.

0

45 giây thể là một trùng hợp ngẫu nhiên - nó có thể là phải mất bao lâu để bạn có thể đạt tới giới hạn bộ nhớ .. tăng giới hạn bộ nhớ sẽ như thế nào:

ini_set('memory_limit', '256M'); 

Nó cũng có thể là kết nối db thực tế đang hết thời gian .. bạn đang sử dụng máy chủ db nào? Đối với tôi, mssql hết thời gian với một lỗi cực kỳ vô ích, "Cơ sở dữ liệu bối cảnh thay đổi", sau 60 giây theo mặc định. Để làm được việc này, bạn cần làm:

ini_set('mssql.timeout', 60 * 10); // 10 min 
15

Tôi đã thử tất cả các giải pháp trên trang này và, tất nhiên, chạy từ dòng lệnh:

php -f filename.php 

như Brent nói là cách hợp lý quanh nó .

Nhưng nếu bạn thực sự muốn chạy tập lệnh từ trình duyệt của bạn, hãy chờ sau 45 giây với lỗi máy chủ nội bộ 500 (như tôi thấy khi xây dựng lại chỉ mục tìm kiếm phpBB của mình). mod_fcgid.

Tôi có một Plesk VPS và tôi cố định nó bằng cách chỉnh sửa tập tin

/etc/httpd/conf.d/fcgid.conf 

Cụ thể, tôi đã thay đổi

FcgidIOTimeout 45 

để

FcgidIOTimeout 3600 

3600 giây = 1 giờ. Nên đủ dài cho hầu hết nhưng điều chỉnh trở lên nếu cần thiết. Tôi thấy một ví dụ trích dẫn 7200 giây trong đó.

Cuối cùng, khởi động lại Apache để cài đặt mới hoạt động.

apachectl graceful 

HTH ai đó. Nó đã làm tôi thất vọng 6 tháng rồi!

Chúc mừng,

Giàu

+0

Cần thiết điều này rất tệ, cảm ơn bạn rất nhiều. – DaveE

+3

HTH = "Hy vọng điều này sẽ giúp" – AVProgrammer

0

Trước hết

max_input_time và Hàm set_time_limit (0)

sẽ chỉ làm việc với VPS hoặc máy chủ chuyên dụng. Thay vào đó, bạn có thể thực hiện theo một số quy tắc để triển khai của mình như bên dưới

  1. Đầu tiên đọc toàn bộ tệp CSV.
  2. Sau đó, chỉ lấy 10 mục (hàng) trở xuống và thực hiện cuộc gọi ajax để nhập trong DB
  3. Cố gắng gọi ajax mỗi lần với 10 mục và sau đó lặp lại điều gì đó trên trình duyệt. Trong phương pháp này, tập lệnh của bạn sẽ không bao giờ hết thời gian chờ.
  4. Làm theo cùng một phương pháp cho đến khi các hàng CSV được hoàn tất.
Các vấn đề liên quan