Hướng dẫn php continue running script

I want to write a script which calls some code but continues to run after calling it. E.g

function foo()
{
 $this->load_function_a();
 $this->load_function_b();
 echo 'A and B succesfully called';
}

I want function the output to be displayed immediately rather than wait for completion of processing of both the functions. Any idea how to achieve this in PHP?

asked Feb 7, 2015 at 13:17

Hướng dẫn php continue running script

3

This is somehow possible if you don't want to display the function's output later.

Instead of using Content-Length: 0 you can also print your real content length and output something. The browser will then see that it read all contents (at least he assumes that) and your script will keep running.

answered Feb 7, 2015 at 13:39

kelunikkelunik

6,5802 gold badges38 silver badges69 bronze badges

3

What you are looking for, are asynchronous function calls. PHP supports multi-threading, although you need the PThreads extension installed on your server. I am not very familliar with multi-threaded programming in PHP (more the .NET guy in those cases :P), but this link might help you quite a bit:

PThreads

answered Feb 7, 2015 at 13:33

Hướng dẫn php continue running script

Ziga PetekZiga Petek

3,7854 gold badges30 silver badges41 bronze badges

This generally isn't easily possible with PHP running in a web environment. There may be various "hacky" methods of accomplishing this, however they will be unreliable such as calling the function in a destructor, or using register_shutdown_function()

In reality the simple answer would be:

function foo()
{
 $this->load_function_a();
 echo 'A succesfully called';
 $this->load_function_b();
}

However I'm assuming this won't suite your needs in your real code. So to solve this problem properly, the real answer would be to use some kind of queue and a queue processor. For example:

  • Having function B queue it's functionality and then later processed by a cron job.
  • Using something such a RabbitMQ or Gearman to process function B's functionality asynchronously.

Hope this helps!

answered Feb 7, 2015 at 13:33

Hướng dẫn php continue running script

A.B. CarrollA.B. Carroll

2,3261 gold badge16 silver badges19 bronze badges

Bài trước chúng ta đã tìm hiểu vòng lặp cuối cùng đó là vòng lặp foreach trong php, vậy thì trong bài này chúng ta sẽ tìm hiểu một số câu lệnh dừng chương trình vòng lặp và lệnh nhảy tới một vị trí nào đó trong file PHP.

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Nội dung chúng ta gồm ó các phần như sau:

  • Câu lệnh Break
  • Câu lệnh Continue
  • Câu lệnh Goto
  • Câu lệnh Die & Exit

1. Câu lệnh break

Lệnh break thường được dùng để thoát khỏi vòng lặp cho dù vòng lặp vẫn chưa kết thúc.

Ví dụ:

Bài viết này được đăng tại [free tuts .net]

for ($i = 1; $i <= 100; $i++)
{
    echo $i . ' ';
    if ($i == 20)
    {
        break;
    }
}

Trong ví dụ này thì vòng lặp được lặp từ 1 cho tới 100, nhưng nó không chạy hết 100 lần bởi vì khi nó chạy tới lần thứ 20 (tức là biến $i = 20) thì câu lệnh kiểm tra if đúng nên lệnh break bên trong câu if được thực hiện và sẽ dừng vòng lặp.

Không chỉ ở vòng lặp for mà các vòng lặp như while và do while, vòng lặp foreach ta đều có thể dùng lệnh break để kết thúc.

2. Câu lệnh continue

Dịch ra tiếng anh cũng đủ hiểu phần nào câu lệnh này, lệnh continue sẽ bỏ qua những đoạn code bên dưới nó và nhảy qua vòng lặp kế tiếp (không thoát hẳn vòng lặp như lệnh break).

Ví dụ:

for ($i = 1; $i <= 10; $i++)
{
    if ($i == 5)
    {
        continue;
    }
    echo $i . ' ';
}

Bài này vòng lặp for lặp từ 1 tới 10 và in ra các số đó. nhưng lạ thay là kết quả thiếu mất số 5 tại vì khi $i = 5 (vòng lặp thứ 5) thì câu lệnh continue đã nhảy chương trình qua vòng lặp mới nên lệnh echo $i không thực hiện được.

Tương tự ta có thể sử dụng lệnh này cho tất cả các vòng lặp for, while, do while và foreach.

3. Câu lệnh goto

Lệnh goto dùng để nhảy đến một dòng code nào đó.

Ví dụ:

$a = 12;
$b = 13;
$c = $a + $b;
 
echo $a;
 
goto label_end;
 
echo $b;
 
label_end;

Trong ví dụ này nếu bình thường thì nó sẽ xuất ra màn hình cả $a và $b nhưng bài này nó chỉ xuất ra màn hình mỗi $a vì dòng goto label_end sẽ nhảy chương trình đến cái nhãn label_end nên dòng echo $b; không được thực hiện. label_end được gọi là nhãn (có thể đặt tên bất kỳ).

Người ta khuyên rằng không nên sử dụng lệnh goto bởi vì nó khó nhìn, lộn xộn khó bảo trì nâng cấp.

4. Lênh die và exit

Với 2 lệnh break và continue chỉ ảnh hương trong vòng lặp thì lệnh die và exit lại ảnh hưởng tới cả chương trình, nếu bạn dùng 2 lệnh này thì chương trình sẽ dừng ngay lập tức và những đoạn code bên dưới die và exit sẽ không được thực hiện.

Ví dụ:

echo '123';
 
die(); // hoặc exit();
echo '456';

Trong ví dụ này kết quả xuất ra màn hình là 123, vởi vì dòng code echo ’456′ không được thực hiện.

5. Lời kết

Thực tế thì ta hay sử dụng lệnh break, continue, die và exit thôi chứ lệnh goto rất ít khi dùng vì nó làm cho chương trình trở lên rối, khó nâng cấp và bảo trì. Bài tiếp theo ta sẽ tìm hiểu hàm trong php.

Hướng dẫn cách sử dụng câu lệnh continue trong php.
Có phải bạn đã quá mệt mỏi với vòng xoay công việc, nhưng bạn vẫn phải continue nó? Hãy cùng Kiyoshi tìm hiểu về câu lệnh continue trong php thông qua bài học sau đây.

Chúng ta sử dụng câu lệnh continue trong php để bỏ qua các dòng lệnh tiếp theo của vòng lặp đang chạy.
Trong một vòng lặp, nếu xuất hiện lệnh continue thì các câu lệnh tiếp theo lệnh continue sẽ được bỏ qua, và chương trình quay lại đầu vòng lặp tiếp theo.

Cú pháp

Cách viết câu lệnh continue trong php như sau:

continue;

Ví dụ

Hãy xem ví dụ dưới đây để hiểu rõ hơn:
Chương trình tính tổng các số lẻ nhỏ hơn 100

$count = 0;
$sum = 0;

while ($count < 100){
$count += 1;

if ($count % 2 == 0){
continue;
}


$sum += $count;
}
print 'sum = '.$sum;

Kết quả

sum = 2500

Ở ví dụ trên, lệnh if được thêm vào bên trong vòng lặp while.Lệnh if này xét biến $count là số chẵn hay lẻ, nếu là số lẻ thì sẽ cộng $count thêm vào biến $num. Còn nếu biến $count là số chẵn, thì sử dụng lệnh continue để bỏ qua quy trình cộng $count thêm vào biến $num, và quay về đầu vòng lặp tiếp theo.

Giống như ví dụ trên, chúng ta có thể dùng lệnh continue để bỏ qua các câu lệnh mà chúng ta không muốn xử lý, khi thoả mãn một điều kiện gì đó.

Lệnh continue giống lệnh break ở chỗ chúng ta có thể chèn tự do vào vòng lặp để điều khiển xử lý vòng lặp theo ý muốn. Tuy nhiên lệnh continue khác break ở chỗ, lệnh break sẽ dừng hẳn tất cả các vòng lặp của lệnh while chứa nó, còn lệnh continue chỉ bỏ qua các lệnh của vòng lặp hiện tại để bắt đầu một vòng lặp mới.

Ngoài ra lệnh continue cũng giống lệnh break ở chỗ, trong một vòng lặp kép , chúng ta có thể chỉ định số thứ tự của lớp để quyết định sẽ bỏ qua bao nhiêu lớp của vòng lặp kép, như cách viết dưới đây:

continue số thứ tự của lớp ;

Hãy xem ví dụ cụ thể dưới đây:

$count1 = 0;
$sum = 0;
while ($count1 < 10){
$count1 += 1;

$count2 = 0;

while ($count2 < 10){
$count2 += 1;
if ($count2==5){
continue ;
}

$sum += $count1 * $count2;
}
}
print 'sum = '.$sum;

Kết quả

sum = 2750

Vòng lặp kép ở ví dụ trên có hai lớp, một vòng lặp trong và một vòng lặp ngoài, với lệnhcontinue nằm ở vòng lặp trong. Do chúng ta dùng lệnh continue mặc định không chứa số thứ tự lớp, nên sau khi lệnh continue được thực hiện, chương trình sẽ bỏ qua các dòng lệnh tiếp theo trong cùng lớp với lệnh continue(nằm trong vòng lặp trong) và quay về vị trí đầu vòng lặp trong.

Cùng với ví dụ trên nhưng với việc chỉ định số thứ tự lớp, hãy xem ví dụ dưới đây:

$count1 = 0;
$sum = 0;
while ($count1 < 10){
$count1 += 1;

$count2 = 0;

while ($count2 < 10){
$count2 += 1;
if ($count2==5){
continue 2 ;
}

$sum += $count1 * $count2;
}
}
print 'sum = '.$sum;

Kết quả

sum = 550

Do chúng ta chỉ định số thứ tự lớp (Lấy vòng lặp trong làm chuẩn là 1, thì vòng lặp ngoài có số thứ tự là 2 ), do đó khi lệnh continue được thực hiện, chương trình sẽ bỏ qua cả các dòng lệnh trong cùng một lớp với lệnh continue ( vòng lặp trong) và quay về vị trí đầu của vòng lặp ngoài. Sự khác biệt là vị trí di chuyển của chương trình là ở đầu vòng lặp trong hay là đầu vòng lặp ngoài.
Chúng ta cũng có thể thấy rõ ở ví dụ hai, chúng ta đã bỏ qua một số vòng lặp bên trong và chuyển thẳng sang vòng lặp bên ngoài, nên tổng được tính sẽ nhỏ hơn ở ví dụ 1.

Thực hành

Trăm hay không bằng tay quen, hãy cùng thực hành với ví dụ sau đây:
Chương trình in ra màn hình tất cả các số có 2 chữ số, mà chữ số tạo thành số đó đều nhỏ hơn 3




print "Chương trình tính tổng các số lẻ nhỏ hơn 100"."\n";
$count1 = 0;
$sum = 0;

while ($count1 < 10){
$count1 += 1;

$count2 = 0;

while ($count2 < 10){
$count2 += 1;
if ($count1 * $count2 > 30){
continue ;
}

$sum += $count1 * $count2;
}
}
print 'sum = '.$sum;

?>

Bạn hãy viết lại các dòng code trên vào cửa sổ luyện tập online dưới đây, sau đó click vào nút Run hoặc nhấn tổ hợp phím Ctrl +Enter và chờ xem điều gì sẽ xảy ra nhé.

Mở cửa sổ luyện tập mới

Tổng kết

Chúng ta dùng câu lệnh continue trong php để bỏ qua các câu lệnh tiếp theo của một vòng lặp. Trong một vòng lặp kép có nhiều lớp, chúng ta có thể quyết định số lớp muốn bỏ qua bằng cách chỉ định số thứ tự của lớp đó khi viết lệnh continue.

Viết bởi Kiyoshi. Đã đăng ký bản quyền tác giả tại <a title="Bạn được tự do chia sẻ bài viết nhưng phải để lại đường link bài viết từ laptrinhcanban.com. Bạn không được sử dụng tài liệu cho mục đích thương mại. Không được phép chỉnh sửa nội dung được phát hành trên website của chúng tôi" style="color:#fff;background-color:silver" rel="license noopener" target="_blank" href="https://creativecommons.org/licenses/by-nc-nd/4.0/">Creativecommons</a>&nbsp;và <a title="Bạn được tự do chia sẻ bài viết nhưng phải để lại đường link bài viết từ laptrinhcanban.com. Bạn không được sử dụng tài liệu cho mục đích thương mại. Không được phép chỉnh sửa nội dung được phát hành trên website của chúng tôi" style="color:#fff;background-color:silver" target="_blank" rel="noopener" href="https://www.dmca.com/Protection/Status.aspx?ID=1631afcd-7c4a-467d-8016-402c5073e5cd" class="dmca-badge">DMCA</a><script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js">

Bài viết liên quan

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>