Giới thiệu
PHP có đầy đủ Đa luồng hỗ trợ mà bạn có thể tận dụng tối đa theo nhiều cách. Đã có thể chứng minh khả năng Đa luồng này trong các ví dụ khác nhau:
- Làm cách nào để có thể sử dụng đa luồng trong các ứng dụng PHP
- pcntl chạy cùng một mã nhiều lần, cần hỗ trợ
- Cải thiện hiệu quả của trình quét HTML với pcntl_fork ()
Tìm kiếm nhanh sẽ cung cấp thêm tài nguyên.
Danh mục
1:Truy vấn MySQL
MySQL hoàn toàn đa luồng và sẽ sử dụng nhiều CPU, miễn là hệ điều hành hỗ trợ chúng, Nó cũng sẽ tối đa hóa tài nguyên hệ thống nếu được định cấu hình đúng cho hiệu suất.
Một cài đặt điển hình trong my.ini
ảnh hưởng đến hiệu suất luồng là:
thread_cache_size = 8
thread_cache_size có thể được tăng lên để cải thiện hiệu suất nếu bạn có nhiều kết nối mới. Thông thường, điều này không cung cấp một sự cải thiện hiệu suất đáng chú ý nếu bạn có một triển khai luồng tốt. Tuy nhiên, nếu máy chủ của bạn thấy hàng trăm kết nối mỗi giây, bạn thường nên đặt thread_cache_size đủ cao để hầu hết các kết nối mới sử dụng các chuỗi được lưu trong bộ nhớ cache
Nếu bạn đang sử dụng Solaris thì bạn có thể sử dụng
thread_concurrency = 8
thread_concurrency cho phép các ứng dụng cung cấp cho hệ thống luồng một gợi ý về số luồng mong muốn sẽ được chạy cùng một lúc.
Biến này không được chấp nhận kể từ MySQL 5.6.1 và bị loại bỏ trong MySQL 5.7. Bạn nên xóa phần này khỏi các tệp cấu hình MySQL bất cứ khi nào bạn nhìn thấy nó trừ khi chúng dành cho Solaris 8 hoặc phiên bản cũ hơn.
InnoDB: :
Bạn sẽ không gặp phải những giới hạn như vậy nếu đang sử dụng Innodb có công cụ lưu trữ vì nó hỗ trợ đầy đủ đồng thời chuỗi
innodb_thread_concurrency // Recommended 2 * CPUs + number of disks
Bạn cũng có thể xem tại innodb_read_io_threads
và innodb_write_io_threads
trong đó mặc định là 4
và nó có thể được tăng lên cao đến 64
tùy thuộc vào phần cứng
Khác:
Các cấu hình khác cũng cần xem xét bao gồm key_buffer_size
, table_open_cache
, sort_buffer_size
v.v ... tất cả đều dẫn đến hiệu suất tốt hơn
PHP:
Trong PHP thuần túy, bạn có thể tạo MySQL Worker nơi mỗi truy vấn được thực thi trong các chuỗi PHP riêng biệt
$sql = new SQLWorker($host, $user, $pass, $db);
$sql->start();
$sql->stack($q1 = new SQLQuery("One long Query"));
$sql->stack($q2 = new SQLQuery("Another long Query"));
$q1->wait();
$q2->wait();
// Do Something Useful
Đây là Ví dụ làm việc đầy đủ của SQLWorker
2:Phân tích cú pháp nội dung HTML
Nếu bạn đã biết vấn đề thì bạn có thể giải quyết dễ dàng hơn thông qua các vòng lặp sự kiện, Hàng đợi Công việc hoặc sử dụng Luồng.
Làm việc trên từng tài liệu một có thể rất rất quá trình chậm chạp, đau đớn. @ka
từng bị hack bằng cách sử dụng ajax để gọi nhiều yêu cầu, Một số bộ óc Sáng tạo sẽ chỉ phân nhánh quy trình bằng cách sử dụng pcntl_fork
nhưng nếu bạn đang sử dụng windows
thì bạn không thể tận dụng pcntl
Với pThreads
hỗ trợ cả hệ thống windows và Unix, Bạn không có giới hạn như vậy. Có dễ dàng như .. Nếu bạn cần phân tích cú pháp 100 tài liệu? Sinh ra 100 chủ đề ... Đơn giản
Quét HTML
// Scan my System
$dir = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$dir = new RecursiveIteratorIterator($dir);
// Allowed Extension
$ext = array(
"html",
"htm"
);
// Threads Array
$ts = array();
// Simple Storage
$s = new Sink();
// Start Timer
$time = microtime(true);
$count = 0;
// Parse All HTML
foreach($dir as $html) {
if ($html->isFile() && in_array($html->getExtension(), $ext)) {
$count ++;
$ts[] = new LinkParser("$html", $s);
}
}
// Wait for all Threads to finish
foreach($ts as $t) {
$t->join();
}
// Put The Output
printf("Total Files:\t\t%s \n", number_format($count, 0));
printf("Total Links:\t\t%s \n", number_format($t = count($s), 0));
printf("Finished:\t\t%0.4f sec \n", $tm = microtime(true) - $time);
printf("AvgSpeed:\t\t%0.4f sec per file\n", $tm / $t);
printf("File P/S:\t\t%d file per sec\n", $count / $tm);
printf("Link P/S:\t\t%d links per sec\n", $t / $tm);
Đầu ra
Total Files: 8,714
Total Links: 105,109
Finished: 108.3460 sec
AvgSpeed: 0.0010 sec per file
File P/S: 80 file per sec
Link P/S: 907 links per sec
Lớp được sử dụng
Sink
class Sink extends Stackable {
public function run() {
}
}
LinkParser
class LinkParser extends Thread {
public function __construct($file, $sink) {
$this->file = $file;
$this->sink = $sink;
$this->start();
}
public function run() {
$dom = new DOMDocument();
@$dom->loadHTML(file_get_contents($this->file));
foreach($dom->getElementsByTagName('a') as $links) {
$this->sink[] = $links->getAttribute('href');
}
}
}
Thử nghiệm
Đang thử phân tích cú pháp 8,714
tệp có 105,109
liên kết không có chuỗi và xem nó sẽ mất bao lâu.
Kiến trúc tốt hơn
Tạo ra quá nhiều chủ đề không phải là một điều thông minh trong sản xuất. Cách tiếp cận tốt hơn sẽ là sử dụng Tổng hợp
. Có một nhóm xác định Công nhân
thì ngăn xếp
với Task
Cải thiện hiệu suất
Tốt thôi, ví dụ trên vẫn có thể được cải thiện. Thay vì đợi hệ thống quét tất cả các tệp trong một luồng duy nhất, bạn có thể sử dụng nhiều luồng để quét hệ thống của tôi để tìm tệp sau đó xếp dữ liệu cho Nhân viên để xử lý
3:Cập nhật chỉ mục tìm kiếm
Điều này đã được giải đáp khá nhiều trong câu trả lời đầu tiên, nhưng có rất nhiều cách để cải thiện hiệu suất. Bạn đã bao giờ xem xét cách tiếp cận dựa trên Sự kiện chưa?
Sự kiện giới thiệu
@rdlowrey Trích dẫn 1:
@rdlowrey Trích dẫn 2:
Tại sao bạn không thử nghiệm với event-driven
, non-blocking I/O
cách tiếp cận vấn đề của bạn. PHP có giải phóng
để tăng phí ứng dụng của bạn.
Tôi biết câu hỏi này là tất cả Multi-Threading
nhưng nếu có thời gian, bạn có thể xem Lò phản ứng hạt nhân được viết bằng PHP
này bởi @igorw
Cuối cùng
Cân nhắc
Tôi nghĩ bạn nên cân nhắc sử dụng Cache
và Job Queue
cho một số nhiệm vụ của bạn. Bạn có thể dễ dàng nhận được một thông báo nói rằng
Document uploaded for processing ..... 5% - Done
Sau đó, thực hiện tất cả các nhiệm vụ lãng phí thời gian trong nền. Vui lòng xem Thu nhỏ công việc xử lý lớn hơn cho một nghiên cứu điển hình tương tự.
Hồ sơ
Công cụ lập hồ sơ? Không có công cụ hồ sơ đơn lẻ nào cho ứng dụng web từ Xdebug tới Yslow đều rất hữu ích. Ví dụ. Xdebug không hữu ích khi nói đến chuỗi vì nó không được hỗ trợ
Tôi không có mục yêu thích