Resource watcher trong laravel
Bài đăng này đã không được cập nhật trong 5 năm
Resource watcher cho phép bạn xem resources (files) thay đổi. Điều này có nghĩa là bạn có thể xem một thư mục và sau đó lắng nghe mọi thay đổi đối với các tệp trong thư mục đó. Ví dụ như bạn có thể create, modify hay delete một file có trong thư mục.
Cài đặt
Trong thư mục source của laravel bạn chạy lệnh sau để cài đặt:
composer require jasonlewis/resource-watcher
thêm dòng này vào provider trong file app.php của laravel
JasonLewis\ResourceWatcher\Integration\LaravelServiceProvider::class,
Viết code nào
Mình sẽ dùng command của laravel để watcher và supervisor để start command này
php artisan make:command WatcherCommand
Lệnh này sẽ tạo ra một file WatcherCommand.php trong thư mục command của probject.
thay đổi:
protected $signature = 'watcher';
trong file kernal thêm dòng sau:
protected $commands = [
WatcherCommand::class // thêm dòng này vào trong $commands
];
trong đó bạn thay đổi hàm handle như sau:
try {
Log::info('starting listen file change ...');
$folderListen = 'path_folder_to_listen'; // folder cần listen thay đổi
$watcher = app('watcher');
$listener = $watcher->watch($folderListen);
// xử lý thay đổi ở đây
$watcher->start();
} catch (\Exception $exception) {
report($exception);
Log::error('fail to listen mess= ' . $exception->getMessage());
}
return;
}
sau khi listen một folder, chúng ta có biến $listener, biến này có các function như sau:
modify, create,delete và anything
ví dụ lắng nghe file thay đổi:
$listener->modify(function($resource, $path) {
echo "{$path} has been modified.".PHP_EOL;
});
lắng nghe file dc create:
$listener->create(function($resource, $path) {
echo "{$path} has been modified.".PHP_EOL;
});
hoàn toàn tương tự với hàm delete.
Riêng anything có chút khác biệt:
$listener->anything(function($event, $resource, $path) {
$event->getCode(); //1 = create, 2= modify, 0 = delete
});
từ đó các bạn có thể sử lý những bước tiếp theo trong function để làm gì với file thay đổi.
Chú ý:
- Khi hệ thống tự động sinh file, đầu tiên file đó sẽ là create, sau đó là modify, event modify sẽ sinh ra liên tục, bạn cần chú ý chỗ này, cần check xem Last Modified của file để biết file đã hoàn toàn được tạo thành công.
public function checkLastModify($path)
{
// run after 1 min
Log::debug('start check last modify file = ' . $path);
$time = time();
$filemtime = filemtime($path);
Log::debug("time = $time, filemtime = $filemtime");
if ($time - $filemtime > 60) { // cách 60s
return true;
}
return false;
}
Hàm này sẽ check file đó dc tạo cách hiện tại 1 phút (60s).
Tiếp theo để test các bạn chạy lệnh sau:
php artisan watcher
Sau đó thay đổi file trong thư mục mà bạn watcher ở trên để xem kết quả.
Installing Supervisor
Tiếp theo ta phải install Supervisor để keep cái watcher kia khi deploy lên server, vì trên server khi chạy php artisan watcher
các bạn thoát terminal ra nó sẽ stop lệnh lại, lên không thể watcher cái gì dc cả. Cũng không nên dùng nophp để chạy lệnh, vì khi code có exeption hay có lỗi gì đó nó sẽ kill process watcher đi, sẽ gay ra lỗi cho những xử lý sau này.
ubuntu:
sudo apt-get install supervisor
tạo file laravel-worker.conf
trong thư mục /etc/supervisor/conf.d
điền nội dung sao vào file:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path_to_project/artisan watcher // thay đổi path đến project của bạn.
autostart=true
autorestart=true
user=nginx // thay đổi username phù hợp với server của bạn.
numprocs=1
redirect_stderr=true
stdout_logfile=/patch_to_logs/worker.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
centos:
yum install -y python-setuptools
easy_install supervisor
yum install supervisor
vim /etc/supervisord.conf
cho nội dung tương tự như ubuntu ở trên vào.
systemctl start supervisord
Vậy là xong rồi đó.
Tài liệu
All rights reserved