2020-04-29 / JSN / 0 Comments / 750 次瀏覽
2023-01-18 修正
Laravel 我寫了一隻 command,透過 schedule 註冊每個小時都要跑這隻程式
|
protected function schedule(Schedule $schedule) { $schedule->command("deploy")->hourly()->unlessBetween('01:00', '07:00'); } |
透過指令
確實可以執行如 “git pull”, “composer install”, “php artisan optimize”, “npm install” …… 但是透過 crontab 卻會異常,顯示 “exec: composer: not found” 找不到指令的問題。
方法 (一)
|
docker-compose exec workspace bash vim /etc/cron.d/laradock |
PATH: 羅列出 shell 搜尋 使用者 輸入的執行命令所在的目錄
|
# 加入這行 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/www/vendor/bin # 下面這行不變 * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
這樣就能順利運行了!
方法 (二) 不建議使用了,僅作參考
以下兩種方法
如果是還沒 Build 專案
首先 Laradock 的專案資料夾會看到 workspace/crontab/laradock,已經寫好了每分鐘執行 php artisan,把它註解掉,因為這個身份是 “laradock”,我們要使用的是 “root”
|
vim workspace/crontab/laradock |
|
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
接著跑起所需要的環境
|
docker-compose build workspace php-fpm docker-compose up -d nginx mongo redis |
進入 workspace 修改 crontab
|
docker-compose exec workspace bash # 我們確定使用者身份 laradock 已經被註解掉了 vim /etc/cron.d/laradock # 增加 root vim /etc/crontab |
添加這行
|
* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1 |
這樣就能使用 root 身份執行 schedule 了。
如果已經 Build
註腳掉原本使用者 laradock 的 crontab
|
docker-composer exec workspace bash vim /etc/cron.d/laradock |
|
# * * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1 |
增加 root 的 crontab
|
* * * * * root cd /var/www && php artisan schedule:run >> /dev/null 2>&1 |
這樣就可以了。
如果有用到 Git Pull ,因為是自動化的關係,因此要使用 ssh ,請參考這篇網友分享的文章,設定不需要打帳號密碼的方式。
2020-04-27 / JSN / 0 Comments / 152 次瀏覽
最近在 Laravel 開發使用 MongoDB 做時間區間的篩選。
因為 Mongo 預設的 _id 具有時間戳記,因此篩選某個時間區段,可以直接透過 _id 做取得。那問題是,如何把時間轉換為 _id 格式呢?以下程式碼提供參考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<?php namespace App\Libraries; use MongoDB\BSON\ObjectId; class MongoDB { /** * 透過指定日期時間,取得 Mongo ObjectId * * @param string $timeString 時間字串,如 2019-01-01 12:52:14 或 2019-01-01 ,只要是時間字串即可 * @return ObjectId 返回 Mongo _id 格式 */ public static function getObjectIdFromTimeString(string $timeString): ObjectId { $timestamp = strtotime($timeString); return new ObjectId(dechex($timestamp) . str_repeat("0", 16)); } } |
那麼 Laravel 就可以這樣比對
|
$id = MongoDB::getObjectIdFromTimeString("2020-02-11 11:18:15"); $result = Interview::select("_id") ->where("_id", ">=", $id) ->get(); |
2020-04-23 / JSN / 0 Comments / 690 次瀏覽
有個狀況是這樣:我們在 GitHub 修改了第三方套件,也 Pull Request 給作者,但作者還沒有 Merge 回去。這時候我們專案又要使用該怎麼辦?
解決方式:
改用自己的 GitHub Repository 即可。
舉例流程,以下示範修改第三方套件 php-simple-html-dom-parser
- 我們從來源
sunra/php-simple-html-dom-parser
fork 一份到自己的 repository 如 fdjkgh580/php-simple-html-dom-parser
- 在自己的 repository
fdjkgh580/php-simple-html-dom-parser
開一個分支命名為 update-php7.4
- 開始修改程式碼並提交到該分支
update-php7.4
- 在 composer.json 改寫。這裡要注意,repository 指定我們 fork 過來的位置;require 改為我們自訂的分支名稱,官方提到會成為這種格式
dev-*
因此要寫成 dev-update-php7.4
,但套件名稱不要更改
|
{ "repositories": [ { "type": "vcs", "url": "https://github.com/fdjkgh580/php-simple-html-dom-parser.git" } ], "require": { "sunra/php-simple-html-dom-parser": "dev-update-php7.4" } } |
- 沒有裝過就 composer install ;已經裝過原本第三方來源,就用 composer update 換成自己的 repository。
上面發生什麼事?
套件 sunra/php-simple-html-dom-parser
本來應該要從第三方來源 sunra/php-simple-html-dom-parser
下載,經過 composer.json 替換後,安裝或更新時,會先檢查是否在 composer.json 定義過 repository。那因為我們定義過了,因此 composer 將原本應該要連去 sunra 的 repository 改成 fdjkgh580 的 repository。
參考官方文件:https://getcomposer.org/doc/05-repositories.md#vcs
2020-03-30 / JSN / 0 Comments / 285 次瀏覽
目前在 Laravel-mix 5.4 (package.json 找得到) 下指令 npm run dev 會跑上好幾分鐘,解決這個辦法可以在 webpack.mix.json 加入已下指令,運行飛快。
|
mix.options({ processCssUrls: false }); |
參考來源:https://github.com/JeffreyWay/laravel-mix/issues/287、JeffreyWay/laravel-mix#287 (comment)
2020-03-12 / JSN / 0 Comments / 3,586 次瀏覽
事前
以下示範 Nginx, MySQL, phpMyAdmin, PHP, Laravel
期望的架構
- myProject (這是你自訂的專案名稱)
- www (放置 Laravel 的地方)
- laradock (你的專案需要的 Laradock 相關檔案)
也就是一個專案會配置一個 laradock 路徑,例如
這樣劃分的優點是每個專案都有專屬的環境,缺點就是你要寫不同專案就要切換不同的 Laradock。
開始步驟
下載 docker
進入專案資料夾後
|
git clone https://github.com/Laradock/laradock.git |
下載下來的檔案會放在路徑 laradock
建立 www
這是我們準備存放 laravel 的路徑
編輯設定
|
cd laradock cp env-example .env vim .env |
修改如
|
APP_CODE_PATH_HOST=../www NGINX_HOST_HTTP_PORT=8000 NGINX_HOST_HTTPS_PORT=4430 MYSQL_PORT=3307 |
檢查設定 php my admin
|
# Credentials/Port: PMA_USER=default PMA_PASSWORD=secret PMA_ROOT_PASSWORD=secret PMA_PORT=8080 |
確認 laradock/.env 關於 MySQL 的相關設定,這些資料我們稍後會用到
|
### MYSQL ################################################# MYSQL_VERSION=latest MYSQL_DATABASE=default MYSQL_USER=default MYSQL_PASSWORD=secret MYSQL_PORT=3307 MYSQL_ROOT_PASSWORD=root |
Docker 修改 Nginx 設定
|
cp -r nginx/sites/laravel.conf.example nginx/sites/laravel.test.conf vim nginx/sites/laravel.test.conf |
修改為
啟動 Docker Image 為 Container
|
docker-compose up -d nginx mysql phpmyadmin |
*停止運行可下指令 docker-compose down
進入工作區域
|
docker-compose exec workspace bash |
在 workspace 內下載 Laravel
注意我們建立的目錄使用 .
|
composer create-project laravel/laravel --prefer-dist . exit |
權限修改
|
docker-compose exec php-fpm id www-data sudo chown -R 1000:1000 www/storage 如果無法寫入,嘗試 cd .. sudo chmod -R 777 www/storage |
嘗試訪問
http://localhost:8000
讓 Laravel 連線 MySQL
修改如下
|
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secret |
存檔後接著
|
exit docker-compose exec workspace bash php artisan migrate |
運行資料庫遷移如果正常運作就沒問題囉!
訪問 phpMyAdmin
http://localhost:8080
我們可以使用這項設定進入
|
server: mysql user: default password: secret |
如果要使用用戶 root 登入,那麼密碼是MySQL 設定中的 “root”。