2011-09-29 30 views
8

Tôi đã tạo ra một php/mysql scraper, mà là chạy tốt, và không có ý tưởng làm thế nào để chạy hiệu quả nhất nó như là một công việc cron.Làm thế nào một công việc cron php có thể chạy trong/am tôi làm đúng không?

Có 300 trang web, mỗi trang có từ 20 đến 200 trang được cạo. Phải mất từ ​​4 - 7 giờ để cạo tất cả các trang web (tùy thuộc vào độ trễ của mạng và các yếu tố khác). Các scraper cần phải làm một chạy hoàn chỉnh một lần mỗi ngày.

Tôi có nên chạy công việc này dưới dạng 1 cron hoạt động trong 4 - 7 giờ hoặc chạy mỗi giờ 7 lần hoặc chạy 10 phút một lần cho đến khi hoàn thành?

Các kịch bản được thiết lập để chạy từ cron như thế này:

while($starttime+600 > time()){ 
    do_scrape(); 
} 

Mà sẽ chạy do_scrape() chức năng, mà cạo 10 url cùng một lúc, cho đến khi (trong trường hợp này) 600 giây có thông qua. Do_scrape có thể mất từ ​​5 - 60 giây để chạy.

Tôi yêu cầu ở đây vì tôi không thể tìm thấy bất kỳ thông tin nào trên web về cách chạy ứng dụng này và tôi lo ngại về việc chạy hàng ngày, vì php không thực sự được thiết kế để chạy dưới dạng một tập lệnh trong 7 giờ.

Tôi đã viết nó trong vanilla PHP/mysql, và nó đang chạy trên cắt giảm debian VPS chỉ với lighttpd/mysql/php5 được cài đặt. Tôi đã chạy nó với một thời gian chờ của 6000 giây (100 phút) mà không có bất kỳ vấn đề (máy chủ không bị ngã).

Bất kỳ lời khuyên nào về cách thực hiện nhiệm vụ này đều được đánh giá cao. Tôi nên theo dõi điều gì cho v.v.? hoặc tôi sẽ thực hiện điều này tất cả sai?

Cảm ơn!

Trả lời

8

Không có gì sai khi chạy tập lệnh PHP được viết tốt trong thời gian dài. Tôi có một số kịch bản có nghĩa đen đã được chạy liên tục trong nhiều tháng. Chỉ cần xem sử dụng bộ nhớ của bạn, và bạn sẽ ổn thôi.

Điều đó nói rằng, kiến ​​trúc của bạn khá cơ bản và không có quy mô rất tốt.

Bạn có thể xem xét chuyển từ tập lệnh nguyên khối lớn sang chiến lược phân chia và chinh phục. Ví dụ, có vẻ như kịch bản của bạn đang thực hiện các yêu cầu đồng bộ cho mỗi URL là mẩu tin lưu niệm. Nếu đó là sự thật, sau đó hầu hết thời gian chạy 7 giờ đó được dành một cách nhàn rỗi chờ đợi phản hồi từ một số máy chủ từ xa.

Trong một thế giới lý tưởng, bạn sẽ không viết loại điều này PHP. Một số ngôn ngữ xử lý các luồng và có thể dễ dàng thực hiện các yêu cầu http không đồng bộ với tính năng gọi lại sẽ phù hợp hơn nhiều.

Điều đó nói rằng, nếu tôi đang làm điều này trong PHP, tôi sẽ hướng đến việc có một kịch bản khởi động N trẻ em lấy dữ liệu từ các URL và dán dữ liệu phản hồi vào một số hàng đợi công việc. kịch bản mà khá nhiều chạy tất cả các thời gian, xử lý bất kỳ công việc nó tìm thấy trong hàng đợi.

Sau đó, bạn chỉ cron trình quản lý tải-script của bạn chạy một lần một giờ, nó quản lý một số quy trình công nhân tìm nạp dữ liệu (trong sao, do đó độ trễ không giết bạn) và gắn công việc trên hàng đợi.Sau đó, hàng đợi-cruncher thấy công việc trên hàng đợi và crunches nó.

Tùy thuộc vào cách bạn triển khai hàng đợi, điều này có thể mở rộng khá tốt. Bạn có thể có nhiều hộp tìm nạp dữ liệu từ xa và dán nó vào một số hộp xếp hàng trung tâm (với hàng đợi được triển khai trong mysql, hoặc memcache, hoặc bất kỳ thứ gì). Bạn thậm chí có thể tưởng tượng có nhiều hộp lấy công việc từ hàng đợi và thực hiện công việc.

Tất nhiên, ma quỷ nằm trong chi tiết, nhưng thiết kế này thường có khả năng mở rộng hơn và thường mạnh mẽ hơn tập lệnh lặp lại quá trình tìm nạp đơn luồng.

+0

Chúc mừng cho thư trả lời. Khi số lượng xử lý sau tối thiểu (~ 150ms cho mỗi yêu cầu trang 2-5 giây), chúng tôi quyết định gắn kết với cấu trúc nguyên khối thay vì tập lệnh uốn và tập lệnh xử lý. Chúng tôi đang sử dụng multi-curl để nhận được 10 URL cùng một lúc, do đó, nó được bán đa luồng, mặc dù không lý tưởng. Python sẽ là lý tưởng, nhưng nó là một trường hợp đi với những gì chúng ta biết (php) để có được công việc làm một cách nhanh chóng. Cảm ơn! – Rob

2

Bạn không gặp sự cố khi chạy nó mỗi ngày một lần để hoàn thành. Đó là cách tôi sẽ làm. Thời gian chờ là một vấn đề lớn nếu php đang được phục vụ thông qua một máy chủ web, nhưng kể từ khi bạn đang diễn giải trực tiếp thông qua thực thi php này là ok. Tôi sẽ khuyên bạn nên sử dụng python hoặc cái gì khác đó là nhiều nhiệm vụ thân thiện, mặc dù.

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