2014-11-24 9 views
7

Có cách nào trong PHP để thực hiện một số hành động (ví dụ chèn mysql) nếu không có yêu cầu mới cho biết 1 giây?Có cách nào để thực thi tập lệnh PHP nếu không có yêu cầu mới nào trong một thời gian không?

Điều tôi đang cố gắng đạt được là xác định bắt đầu và kết thúc chuỗi hình ảnh được gửi từ camera IP. Máy ảnh gửi chuỗi hình ảnh về chuyển động được phát hiện và dừng gửi khi chuyển động dừng lại. Tôi biết rằng máy ảnh tạo ra 5 hình ảnh mỗi giây (mỗi 200ms). Khi không có hình ảnh mới trong hơn 1 giây, tôi muốn gắn cờ hình ảnh cuối cùng khi kết thúc chuỗi, chèn một bản ghi vào mysql, đặt img vào thư mục thích hợp (tất cả các imgs khác từ cùng một chuỗi đã được viết) và hướng dẫn ứng dụng để tạo một đoạn hình ảnh MJPEG trong thư mục đó. Ngay bây giờ tôi có thể xác định hình ảnh đầu tiên trong chuỗi bằng cách sử dụng Alternative PHP cash để tiết kiệm thời gian tham chiếu từ yêu cầu trước đó, nhưng vấn đề là vì chuỗi hình ảnh tiếp theo có thể xảy ra vài giờ sau đó và tôi không thể hướng dẫn PHP đóng trình tự KHÔNG có yêu cầu nào trong một thời gian, chỉ khi yêu cầu đầu tiên của chuỗi mới đến.

Tôi thực sự cần trợ giúp về vấn đề này. PHP My hút gần như là tiếng Anh của tôi ... :)

Pseudo code cho vấn đề của tôi:

<?php 
    if(isset($headers["Content-Disposition"])) 
    { 
     $frame_time = microtime(true); 
     if(preg_match('/.*filename=[\'\"]([^\'\"]+)/', $headers["Content-Disposition"], $matches)) 
     { $filename = $matches[1]; } 
     else if(preg_match("/.*filename=([^ ]+)/", $headers["Content-Disposition"], $matches)) 
     { $filename = $matches[1]; } 
    } 
    preg_match("/(anpr[1-9])/", $filename, $anprs); 
    $anpr = $anprs[1]; 
    $apc_key = $anpr."_last_time"; //there are several cameras so I have to distinguish those 
    $last = apc_fetch($apc_key); 
    if (($frame_time - $last)>1) 
     { 
      $stream = "START"; //New sequence starts 
     } else { 
      $stream = "-->"; //Streaming 
     }; 
    $file = fopen('php://input', 'r'); 
    $temp = fopen("test/".$filename, 'w'); 
    $imageSize = stream_copy_to_stream($file, $temp); //save image file on the file system 
    fclose($temp); 
    fclose($file); 

    apc_store($apc_key, $frame_time); //replace cashed time with this frame time in APC 

    // here goes mysql stuff... 

    /* Now... if there is no new requests for 1 second $stream = "END"; 
    calling app with exec() or similar to grab all images in the particular folder and make 
MJPEG... if new request arrives cancel timer or whatever and execute script again. */ 

?> 
+2

vấn đề thú vị, có lẽ khi hình ảnh đầu tiên phát hiện ra một tập tin nền \ script mà ngủ trong 10 giây sau đó kiểm tra xem nếu chuyển động là hơn nếu không ngủ một lần nữa, vòng lặp cho đến khi done.OR một công việc cron bao giờ phút kiểm tra chống lại db \ file date –

+0

Những gì tôi đang tìm kiếm thực sự là một cách (nếu có thể) để chạy bộ đếm thời gian async mà tôi có thể hủy bỏ nếu yêu cầu mới đến ... Tôi là một người javascript vì vậy có lẽ những đám mây của tôi lý luận với PHP. Tạo tập tin con/tập lệnh trông đầy hứa hẹn. Tôi sẽ nhìn vào đó. – Gawran

Trả lời

-1

cửa hàng mỗi yêu cầu từ máy ảnh với tất cả các dữ liệu và dấu thời gian của mình trong một tập tin (theo mẫu php đăng) . Trong cronjob chạy (mỗi 10 giây hoặc lâu hơn) một kịch bản mà đọc tập tin đó và tìm thấy yêu cầu có nhiều hơn sau đó một giây sau khi họ trước khi yêu cầu sau đây. Lưu dữ liệu từ các yêu cầu như vậy và xóa tất cả các yêu cầu khác.

+0

Tần suất tối thiểu cho công việc cron là 1 phút, do đó bạn sẽ phải chạy tập lệnh php làm daemon nếu bạn muốn tần suất 5 giây –

+0

http://askubuntu.com/questions/800/how-to-run-scripts- mỗi-5-giây-sử dụng-cron –

0

Điều gì sẽ xảy ra nếu bạn chỉ giữ tập lệnh chạy trong 1 giây sau khi lưu trữ khung để kiểm tra thêm khung hình? Tôi tưởng tượng bạn có thể muốn đóng kết nối trước khi 1 giây hết hạn, nhưng tomlgold2003 và arr1 có câu trả lời cho bạn: http://php.net/manual/en/features.connection-handling.php#93441

Tôi nghĩ rằng điều này sẽ làm việc cho bạn:

<?php 
ob_end_clean(); 
header("Connection: close\r\n"); 
header("Content-Encoding: none\r\n"); 
ignore_user_abort(true); // optional 
ob_start(); 

// Do your stuff to store the frame 

$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush();  // Strange behaviour, will not work 
flush();   // Unless both are called ! 
ob_end_clean(); 

// The connection should now be closed 

sleep(1); 
// Check to see if more frames have been added. 
?> 

Nếu máy chủ của bạn đang mong đợi để xem một tải cao, đây có thể không phải là câu trả lời cho bạn vì khi nhận được 5 khung hình mỗi giây, sẽ có 5 kịch bản kiểm tra xem họ có gửi khung cuối cùng hay không.

1

Bạn có thể yêu cầu mỗi lần ngủ 1,5 giây trước khi thoát và khi bước cuối cùng kiểm tra xem dấu thời gian đã được cập nhật chưa? Nếu có, hãy thoát ra và không làm gì cả. Nếu không, lưu chuỗi vào mysql. (Điều này sẽ yêu cầu mutexes, vì mỗi yêu cầu http sẽ được kiểm tra và cố gắng để lưu trình tự, nhưng chỉ có một yêu cầu phải được phép.)

Cách tiếp cận này sẽ hợp nhất tập tin con/tập lệnh vào mã php (một codebase đơn , dễ bảo trì hơn), nhưng nó có thể có thể sử dụng bộ nhớ bóng (mỗi yêu cầu sẽ ở lại trong bộ nhớ 1,5 giây, đó là một thời gian dài cho một máy chủ bận rộn).

Một cách tiếp cận khác là làm cho tệp phụ/tập lệnh thành yêu cầu lặp lại trên máy chủ http localhost, có lẽ là dấu chân bộ nhớ nhỏ hơn nhiều. Mỗi khung hình sẽ kích hoạt một yêu cầu để hoàn thành trình tự (tương tự một lần nữa, với các mutex).

Hoặc có thể tạo một cuộc gọi dịch vụ riêng biệt đã kiểm tra và lưu tất cả các trình tự, và có một công việc cron ping mỗi vài giây. Hoặc có mỗi khung ping nó, nếu một yêu cầu thứ hai có thể phát hiện ra rằng các dịch vụ đã chạy nó có thể thoát. (trạng thái chia sẻ trong bộ nhớ cache APC)

Chỉnh sửa: Tôi nghĩ tôi đã đề xuất những gì đã được byte hóa ở trên.

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