Làm sao để chạy một hàm thông qua exec() trong php

em chào mọi người ạ. em đang có vấn đề là em muốn chạy 1 hàm trong php bằng hàm exec() của php mà e k mò ra ạ. cụ thể là hàm e ví dụ như này ạ

public funtion nameFunction($param){
            echo $param;   
        }

Hàm exec() là để thực thi các ứng dụng khác trên máy mà.
Còn bạn muốn chạy hàm chỉ cần gọi hàm đó thôi.

5 Likes

dạ thực tế là e đang có 1 vòng for gọi đến nhiều lần vào 1 hàm nếu để thông thường thì xử lí rất lâu. theo e tìm hiểu exec() này chạy theo quy tắc bất đồng bộ nên e muốn sử dụng nó gọi đến hàm để đáp ứng nhu cầu trên ạ

File test.php có code:

<?php
        echo exec('whoami');
?>

Output:

_www

Cái code trên, thằng PHP sẽ chạy cái lệnh whoami (là commend line của system), để hỏi coi nó đang được sử dụng dưới quyền của user nào

Nó sẽ output ra _www, tức là user được quyền chạy cái trên apache server (đang xài macOS), cụ thể hơn nó là thằng đang chạy cái file test.php đó

Tác dụng của hàm exec() là vậy đó. Bạn cho vộ loop, chạy 100 lần, thì nó sẽ output cái username _www ra 100 lần (minh cũng không rõ “quy tắc bất đồng bộ” bạn nói ở trên là gì, nên cũng không dám nói sâu hơn)

5 Likes

dạ có thể câu hỏi e đặt ra hơi lan man. e có 1 hàm:

public function nameFunction($param)
{
   //process function ......
}

và 1 vòng for:

for($i=1;$i<=100;$i++) {
  $this->nameFunction($param);
}

hàm nameFunction() của e để hoàn thành xử lí logic bên trong nó mất 10s, nếu e chạy như vòng for bên trên thì nó cứ phải đợi 10s để hàm xử lí xong rồi mới for tiếp nữa thì sẽ mất 10x100=1000s. Và e đang muốn vòng for gọi đến hàm đó nhưng chưa cần biết xử lí xong hay chưa xong vẫn chạy tiếp for. nếu bình thường e sẽ sử dụng queue. nhưng hiện tại e đang muốn sử dụng exec() của php ạ

Hình như bạn hiểu sai cái gọi là bất đồng bộ của hàm exec của PHP rồi thì phải. Hàm này bản chất vẫn là blocking do đó k có cái gọi là bất đồng bộ gì ở đây cả. Tuy nhiên có 1 đặc tính của hàm này chính là cho phép gọi 1 lệnh của OS tương tự cách mà bạn gõ 1 câu lệnh trong bash shell vậy. Do đó nếu bạn muốn nó bất đồng bộ hay gì đó thì thực sự nó không chỉ còn là các kiến thức về PHP nữa.

6 Likes

Để xử lý một việc gì đó mà mất hết tận 10 giây và còn phải lặp lại nhiều lần, thì mình suggest bạn tìm hiểu về multi-threading
Ngoài ra, có thể cách xử lý của bạn chưa tối ưu, dẫn đến việc thực thi quá lâu.
Và có thể bạn chọn chưa đúng ngôn ngữ lập trình để xử lý vấn đề (ví dụ dùng PHP để crawl data từ website vẫn được, nhưng trong nhiều trường hợp, xài Python sẽ phù hợp hơn)

4 Likes

Nhưng nói chung mình cũng không khuyến khích. Cách hoạt động của PHP không phù hợp với việc xử lý song song, lấy kéo gọt hoa quả cũng được thôi nhưng lằng nhằng, kết quả cũng không tốt.

7 Likes

dạ e cảm ơn mn. sau góp ý mn chắc e vẫn phải sử dụng queue

Cơ chế trong PHP thường ưu tiên chạy queue job hơn là bất đồng bộ . Nếu bạn muốn chạy bất đồng bộ trong php thì thường là sẽ sử dùng cli chạy command trên các thread riêng biệt .
Còn hàm exec thường được dùng để thực thì các hàm hệ thống thôi .

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?