Laravel — php artisan storage:link on Shared Hosting以cPanel 為例

前言

一般來說,在Laravel專案上處理用戶檔案上傳,我們會使用外部服務作為輔助去處理檔案的儲存,例如Amanzon 的 S3、或微軟的 azure 等雲端的storage服務。
這樣做的好處是我們可以更專注的在程式的撰寫與版控,將程式碼與程式上線後用戶上傳的檔案拆分開來,在後續主機搬移或重新部署上也更加方便簡單,不需要讓用戶上傳的檔案佔據主機的資源也不需要手動去處理這些檔案。
儘管如此我們還是有機會遇到需要使用local環境作為Storage的時候,這時候我們會需要以 php artisan storage:link 這個指令為你設定的public storage做一個 symlink 到public底下,以供用戶存取檔案。

如果你使用的主機不是實體主機、虛擬私人主機、或Docker主機而是虛擬主機的話,有幾種做法可以參考


via SSH

第一種作法,你可以透過ssh指令,直接產生storage捷徑

$ php artisan storage:link

或者你也可以直接使用Linux的語法

$ ln -s /path/to/target /path/to/shortcut

via Cron Jobs

第二個做法,透過主機排程去製作捷徑。

在你的cPanel面版上你可以找到cron jobs的設定選項

cPanel 控制面板

點選 cron job,然後設定排程

在cPanel上設定排程上是非常方便的,在一般設定中你有很多的預設選項可以選,如果你有其他的特殊設定方法再手動設定即可。

cron jobs 預設多個選項可以使用

via PHP symlink Function

第三種作法,撰寫一支簡單的php程式去製作捷徑。

//symlink.php
<?php
$target = '/path/to/project/storage';
$shortcut = '/path/to/project/public/storage';
symlink($target, $shortcut);

你可以直接將這支檔案放在public底下,使用瀏覽器瀏覽直接執行:

https://yourdomain/symlink.php

或你也可以直接在你的專案下增加一個簡單的 route

// routes/web.php
<?php
Route::get('create-symlink', function () {
  Artisan::call('storage:link');
});

一樣直接瀏覽器瀏覽執行:

https://yourdomain/create-symlink

產生完storage的連結在移除程式即可。

補充

另外值得一提的是:一般虛擬主機(Shared Hosting)會因為一些安全性因素,而不提供ssh的連線使用或是封鎖一些可能具有安全性漏洞的php函式,像是 symlink()、proc_open(),造成剛上述提到的方法 php artisan storage:linksymlink() 無法正確執行。
這時候只好直接使用cron jobs 透過ln -s指令產生捷徑了。

Reference

留言

這個網誌中的熱門文章

什麼是QEMU ? 什麼是KVM ? 什麼是QEMU-KVM?

[Mac OSX] 如何關閉開機啟動的應用程式?