目前分類:Laravel (4)

瀏覽方式: 標題列表 簡短摘要

Laravel Medialibrary

Info

Installation

composer require spatie/laravel-medialibrary:^7.0.0
  • db migration,會建立 media table
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="migrations"
php artisan migrate
  • 產生設定檔
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="config"

Setting

  • 預設 disk_name 是 public,這個設定對應 config/filesystems.php;建議另外建立一個設定檔,範例是用 media

    'disks' => [
        // ...
 
        'media' => [
            'driver' => 'local',
            'root' => public_path('media'),
            'url' => env('APP_URL') . '/media',
            'visibility' => 'public',
        ],
 
        // ...
    ],
return [
 
    /*
     * The disk on which to store added files and derived images by default. Choose
     * one or more of the disks you've configured in config/filesystems.php.
     */
    'disk_name' => 'media',
 
    // ...
];

Usage

  • 在需要媒體檔案功能的 eloquent 中實作並使用 Trait
namespace App;
 
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
 
class Test extends Model implements HasMedia
{
    use HasMediaTrait;
 
    // ...
}
  • 設定媒體檔案,會自動把檔案存到之前設定的路徑中,並儲存檔案相關訊息至 table media
// 取得物件
$item = Test::find(1);
// 設定媒體檔案,可以使用絕對路徑,網址連結或是表單上傳的檔案物件
$item->addMedia($pathToFile)
   // 指定分類 test,或不填使用預設
   ->toMediaCollection('test');
  • 取得媒體檔案
$item = Test::find(1);
$media = $item->getMedia();

Converting

  • 這個套件包含同作者製作的另一個影像處理套件 spatie/image,詳細文件可以參考這裡;所以可以很容易在處理媒體檔案的同時,做一些簡單的處理(調整大小、模糊化、馬賽克、灰階等)
  • 透過 override eloquent registerMediaConversions() 實現
class Test extends Model implements HasMedia
{
    // ...
 
    /**
     * register media conversions
     *
     * @param \Spatie\MediaLibrary\Models\Media $media
     */
    public function registerMediaConversions(\Spatie\MediaLibrary\Models\Media $media = null)
    {
        // 建立 200x100 的縮圖
        $this->addMediaConversion('thumb')
              ->width(200)
              ->height(120)
              // 只處理 test collection
              ->performOnCollections('test')
              // 預設會使用 queue 處理,可以利用這個函式直接處理不需透過 job
              ->nonQueued();
 
        // 建立灰階圖片
        $this->addMediaConversion('greyscale')
              ->greyscale()
              ->nonQueued();
 
    }
 
    // ...
  • 之後如果有新增轉換格式,也可以透過 cmd 讓之前的檔案重新產生,也可以利用參數指定條件
php artisan medialibrary:regenerate
  • 還有一個比較特別的地方,可以擷取影片的內容縮圖;但是必須依賴 PHP-FFMpeg/PHP-FFMpeg 套件,系統也必須安裝 FFMpeg;實測可以成功
文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

WINDOWS

  • Ctrl+, 開啟使用者設定
  • Ctrl+P 開啟快速輸入命令列
  • Ctrl+K, Ctrl+S 開啟鍵盤快速鍵設定
    • editor.action.transformToUppercase 全部轉大寫設定
    • editor.action.transformToLowercase 全部轉小寫設定

config

{
    // 刪除檔案時需要確認
    "explorer.confirmDelete": true,

    // PHP 在輸入時檢查
    "php.validate.run": "onType",

    // PHP 的可執行檔位置,這邊是 Windows 的設定範例
    "php.validate.executablePath": "D:\\php\\php.exe",

    // 關閉內建的自動完成(以 PHP Intelephense 的自動完成為準)
    "php.suggest.basic": false,

    // 儲存的同時自動刪除程式碼後無意義的空白
    "files.trimTrailingWhitespace": true,

    // 連點滑鼠右鍵時,包含 PHP 的變數前置 $ 符號(原正規式去除 "$")
    "editor.wordSeparators": "`~!@#%^&*()-=+[{]}\\|;:'\",.<>/?",

    // 開啟自動換行功能
    "editor.wordWrap": "on",

    // 設定字型大小
    "editor.fontSize": 16,

    // 關閉右側 minimap
    "editor.minimap.enabled": false,

    // 關閉預覽模式,檔案會以新分頁開啟(每一支檔案獨立分頁)
    "workbench.editor.enablePreview": false,

    // 設定檔案結尾方式
    "files.eol": "\n",

    // 關閉 PHP Intelephense 的 format(以 phpfmt 為準)
    "intelephense.format.enable": false,

    // phpfmt php 執行檔位置
    // "phpfmt.php_bin": "D:\\php\\php.exe",

    // 開啟變數等號與陣列箭頭的自動對齊
    // "phpfmt.enable_auto_align": true,

    // 設定 PHP 使用的預設 Formatter phpfmt,開啟儲存前先 format
    "[php]": {
        // "editor.defaultFormatter": "kokororin.vscode-phpfmt",
        "editor.defaultFormatter": "junstyle.php-cs-fixer",
        "editor.formatOnSave": true,
    },

     // php-cs-fixer
    "php-cs-fixer.executablePath": "php-cs-fixer",
    "php-cs-fixer.executablePathWindows": "",   //eg: php-cs-fixer.bat
    "php-cs-fixer.onsave": true,
    "php-cs-fixer.rules": "@PSR2",
    "php-cs-fixer.config": ".php_cs;.php_cs.dist",
    "php-cs-fixer.allowRisky": false,
    "php-cs-fixer.pathMode": "override",
    "php-cs-fixer.exclude": [],
    "php-cs-fixer.autoFixByBracket": true,
    "php-cs-fixer.autoFixBySemicolon": false,
    "php-cs-fixer.formatHtml": false,
    "php-cs-fixer.documentFormattingProvider": true

    // getter setter 註解間的空格數量
    "phpGettersSetters.spacesAfterParam": 1,
    "phpGettersSetters.spacesAfterParamVar": 1,
    "phpGettersSetters.spacesAfterReturn": 1,
}

plugins

有人在 git 上回報,似乎蠻多人都有遇到Go to definition no definition found 的問題

網友建議用另一套 PHP Intelephense

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

Laravel Horizon

Info

Installation

composer require laravel/horizon
  • 產生 UI 介面檔案
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

Setting

  • 所有設定都在 config/horizon.php
config/horizon.php
return [
    // 使用連線名稱,對應 config/database.php Redis 的連線設定值,建議用一個獨立的連線設定 e.g. horizon
    'use' => 'horizon',
 
    // 在 Redis 中的前置詞,使用預設
    'prefix' => env('HORIZON_PREFIX', 'horizon:'),
 
    // 程式執行過久的時間設定(單位:秒),似乎與通知有關;沒有用到,使用預設
    'waits' => [
        'redis:default' => 60,
    ],
 
    // 在 Laravel Horizon 介面中 "Recent Jobs" 與 "Failed" 資料存活時間(單位:分),使用預設
    'trim' => [
        'recent' => 60,
        'failed' => 10080,
    ],
 
    // 重要環境設定
    'environments' => [
        // production 環境
        'production' => [
            // 相當於之前在 supervisor 中的設定
            'supervisor-test' => [
                // queue 連線使用 redis,,對應 config/queue.php Redis 的設定值,使用預設
                'connection' => 'redis',
                // queue 名稱列表,如果沒有使用 balance 會依照順序執行:queue1 > queue2 > queue3
                'queue' => ['queue1', 'queue2', 'queue3'],
                // 平衡設定:false(不使用), 'simple'(平均), 'auto'(自動調整,會給比較忙的 queue 多一點 worker)
                'balance' => false,
                // worker 數
                'processes' => 1,
                // 重試次數
                'tries' => 3,
            ],
 
            'supervisor-balance' => [
                'connection' => 'redis',
                // queue4 = queue5, worker 數自動分配
                'queue' => ['queue4', 'queue5'],
                // 自動調整
                'balance' => 'auto',
                'processes' => 10,
                'tries' => 3,
            ],
        ],
 
        // local 本機環境
        'local' => [
            'supervisor-test' => [
                'connection' => 'redis',
                'queue' => ['queue1', 'queue2', 'queue3'],
                'balance' => false,
                'processes' => 1,
                'tries' => 3,
            ],
 
            'supervisor-balance' => [
                'connection' => 'redis',
                'queue' => ['queue4', 'queue5'],
                'balance' => 'auto',
                'processes' => 10,
                'tries' => 3,
            ],
        ],
    ],
];

Usage

  • 改用 Horizon 管理 queue
php artisan horizon
  • 修改 Supervisor 設定
sudo vi /etc/supervisor/conf.d/laravel-worker.conf
/etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-horizon]
process_name=%(program_name)s
command=php /var/www/project/artisan horizon
autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile=/var/www/project/storage/logs/horizon.log
  • 重讀 Supervisor 設定
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-horizon:*
  • 可以在 /app/Providers/AppServiceProvider.php 另外加入驗證,讓特定環境/IP/使用者才能看到監控介面
public function boot()
{
    // ...
 
    // horizon authentication
    Horizon::auth(function(Request $request) {
        return ($this->app->environment('local') || in_array($request->ip(), ['xxx.xxx.xxx.xxx']) || auth()->guard('admin')->check());
    });
}

Deploying

  • 因為現在改由 Horizon 管理 queue,之前使用的
    php artisan queue:restart

    要修改成

    php artisan horizon:terminate
  • 其他設定上的修改可以參考Deploying Horizon To Laravel Forge

Trouble Shooting

Monitor Tag 送出沒有反應

  • 因為被 middleware VerifyCsrfToken 擋下來,可以參考這邊的做法忽略
protected $except = [
    // ...
    'horizon/*',
];

Jobs 憑空消失

  • 不確定是不是 bug,但這邊提供設定似乎可以解決,在 config/queue.php Redis 的連線設定中加入參數
'redis' => [
    'driver' => 'redis',
    'connection' => 'queue',
    'queue' => 'default',
    'retry_after' => 90,
    // 加入此設定
    'block_for' => null,
],

MISCONF Redis is configured to save RDB snapshots

Reference

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

Service Supervisor execution error

Problem

  • Laravel 5.5 文件 隊列 Supervisor 配置詳細解釋 Supervisor 的安裝與設定,不過實際在本機安裝時卻一直無法成功執行 php artisan queue:work
  • live EC2 安裝 Supervisor 使用相同設定卻沒有問題
  • 輸出 log 資訊有 php error:
PHP Parse error:  syntax error, unexpected '?' in /var/www/app/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php on line 233

Solution

  • 試著修改 Supervisor 設定檔卻一直沒有解決
  • 後來決定從 php error 訊息下手,google 後發現這個錯誤是因為使用 PHP 7.0 以才支援的 ?? 導致舊版本 PHP 無法判讀,不過從 cli 或是 web 看 PHP 的版本都是 7.1.8
  • 突然想到本機有裝phpbrew,因為系統內存在多版本,所以在 crontab 需要特別指定版本;推測 Supervisor 也是相同道理
  • 修改設定檔 command 參數,後來果然成功執行了!
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=/root/.phpbrew/php/php-7.1.8/bin/php /var/www/app/artisan queue:work --daemon --delay=3 --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log
文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼