2019年9月16日 星期一

Lumen 微框架建立筆記


依官方文件操作

根據 lumen 的官方文件說明,先決條件是
  • PHP >= 7.1.3
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
當然 composer 也是要先安裝好的,接著開啟 命令提示窗 執行
  • composer global require "laravel/lumen-installer"

一般在windows安裝 composer 都會被預設在
  • C:\Users\xxxx\AppData\Roaming\Composer\vendor\bin
   xxxx:表示使用者名稱

到這裡表示可以使用 lumen 當作指令來建立一個新的 lumen 專案,再依文件走,執行
  • lumen new blog (名稱隨自己喜歡來取)
建立完畢後,先把 .env.example 複製一份,改名為 .env 為後續先做好準備



====== 以上看起都是沒有問題的,只是我遇到的問題如下 ======

本機操作


再來我把我準備好的 docker 給啟起來,對應好剛剛建立完成的專案,確保 docker 有正常運行,把在 C 槽的 vendor 給 copy 到新建立的專案( Laravel 5.1 時,我是這麼做的)

這時候依照 docker 設定的 port 號打上網址列,是不會正常運作剛剛建立好專案,這不是專案有錯,也不是 docker 有問題

當我想要執行 php artisan key:generate 馬上就出錯了,很像是 lumen 沒有這個方法可以使用,循著錯誤找,一直沒有具體的解法,大部份都是說


  • composer update
  • composer --no-script install
  • composer dump-autoload


照著去做的時候,就發現,我的 dockerfile 跟 php.ini 沒有加到 mbstring、openssl、phpunit 等等的錯誤,後來,找到好心人解說,要把


  • vendor、composer.json 都刪掉,再重做 composer install


但我還是出錯,就是 composer 的提示,說有些問題要處理,只好去找一個完整的 dockerfile 內容來重建我的 docker 環境,終於被我找到可用又夠完整的 dockerfile,重建 docker 後,再執行 composer install 就成功了,當然,在 .env 的 app_key,這是要補上的,所以就用了


$router->get('/key', function () {
     return str_random(32);
});
這個方式來取得亂數,補上 app_key,就可正常運作

2019年7月1日 星期一

在 VS CODE 使用 php cs fixer (win 10 環境)

第一步

先下載 vs code 並且安裝好它,開啟後,找到紅色框
在搜尋框裡鍵入「php cs fixer」,或是外掛列表中有顯示,就直接點入,並且 install 安裝它


第二步

到 composer 的官網去下載 windows 用的 Composer-Setup.exe 下載來安裝


安裝完後,你開啟終端機,並且輸入「composer -V」,就可以看到 composer 的版本號了,此時終端機不要關


再來執行安裝「composer global require friendsofphp/php-cs-fixer」


接著終端機就會開始跑安裝的內容,如果一直沒動作時,可按「CTRL + C」,就會再持續安裝

安裝完畢的東西放在哪裡?
基本上是放在「C:\Users\{你的使用者名稱}\AppData\Roaming\Composer」,會產生出「vendor」資料夾


但我們要使用的檔案則是在「C:\Users\{你的使用者名稱}\AppData\Roaming\Composer\vendor\bin」的「php-cs-fixer」、「php-cs-fixer.bat」這兩個檔案

知道檔案在哪了,就要回到 vs code 來做設定了,按下「CTRL +  , 」就會開啟設定檔 ( settings.json ),然後要找到「Executable Path」、「Executable Path Windows」

Executable Path:${extensionPath}\php-cs-fixer.phar
Executable Path Windows:C:\Users\{你的使用者名稱}\AppData\Roaming\Composer\vendor\bin\php-cs-fixer.bat


再來往下捲,找到「Onsave」,把它打勾,就可以打開你的程式修改,然後在按下「CTRL + S」就會被作用了

設定檔,也可以參考外掛本身文件的內容調整



補充

可能會有人說「${extensionPath}」這個是做什麼用的,怎麼改都不會消失??!!
因為這是 composer 在安裝後,會在 windows 系統裡的環境變數中加入預設的位址,也就是指「C:\Users\{你的使用者名稱}\AppData\Roaming\Composer\vendor\bin」這一段

要怎麼查看呢?




以上就是 vs code 安裝 php cs fixer 的操作解說

2018年2月6日 星期二

Mail Server 使用 office365 的方法

當建立好一台 mail server 的時候,我們就必須要讓它能正常的使用,但是如果你的組織中有購買 office365的服務時,當然你也能使用的他的 mail服務。

在網路上能夠找到很多的訊息去設定,在這裡要說明的是 relayhost 的設定,做一個記錄。
網路上找到有關   vi /etc/postfix/main.cf  的設定,都會讓我們設定成
relayhost = [smtp.office365.com]:587
但是,我在使用時,卻會一直報錯,說我未經驗證的發送信件,我猜測主要是沒有取得與 office365 之間的憑證,才會出錯。

在找到微軟關於 office365 的 smtp 網頁說明後,找到了這一段
https://support.office.com/en-us/article/How-to-set-up-a-multifunction-device-or-application-to-send-email-using-Office-365-69f58e99-c550-4274-ad18-c805d654b4c4
Option 3: Configure a connector to send mail using Office 365 SMTP relay
This option is more difficult to implement than the others. Only choose this option when:
  • SMTP client submission (Option 1) is not compatible with your business needs or with your device
  • You can't use direct send (Option 2) because you must send email to external recipients.
SMTP relay lets Office 365 relay emails on your behalf by using your public IP address (or a certificate) to authenticate Office 365. To do this, you'll need to set up a connector for your Office 365 account, which is what makes this a more complicated configuration.



Settings for Office 365 SMTP relay

Device or application setting
Value
Server/smart host
Your MX endpoint, e.g. yourcontosodomain-com.mail.protection.outlook.com
Port
Port 25
TLS/StartTLS
Enabled
Email address
Any email address for one of your Office 365 verified domains. This email address does not need a mailbox.

這一段的重點就是在於「yourcontosodomain-com.mail.protection.outlook.com

當有購買 office365 的服務,也使用他們的信箱時,在 dns server   會看到這一段,因為這是必要設定的,所以把剛剛的

relayhost = [smtp.office365.com]:587
改成
relayhost = [yourcontosodomain-com.mail.protection.outlook.com]:25
就能夠順利的寄出,這只是重點說明,欲參考的人,請連
https://linuxhowtoguide.blogspot.tw/2017/03/how-to-configure-postfix-smtp-relay.html
做其他的設定作為參考

https://brightnormallife.blogspot.com

2017年7月30日 星期日

[PHP]假文產生功能

在網路上,我們可能為了測試一些表單,或是為了填充一些網頁空間,需要一些沒有意義,但能擠滿某些空間的文字。

隨便搜尋「假文產生器」,就有很多文章在介紹及教學,但主要都是以 javascript 的方式操作,也有在直接放在瀏覽器的書籤上使用。

在這裡,我要做的是 PHP版本,可以在後端測試使用

因此,要使用這段程式的人,請確保你已經有一個完善的 PHP環境

前置作業:
XAMPP、APPSERV、免費(或付費) PHP 網站空間
PHP:5.6以上
HTTPD:apache、nginx皆可

程式如下:

function get_fake_content($number = 0)
{
    $default_content = $br_ary = [];
    $str_number = 10;   //字數預設值

    if ($number > 0) {
        $str_number = $number;
    }

    //取檔案內的所有文字
    $string = file_get_contents('words.txt');
    //標點符號
    $symbol = [",", "。", "~", "!", "?", ";", ";", "、", "...."];
    if (isset($string) and !empty($string) and is_string($string)) {
        //拆解文字變成陣列
        $new_str_ary = preg_split('/(?<!^)(?!$)/u', $string);
    }

    for ($k = 0; $k < $str_number; $k++) {
        //隨機取一個字塞入陣列
        $default_content[] = $new_str_ary[rand(0, count($new_str_ary) - 1)];
        //隨機取一個符號塞入陣列
        if (isset($symbol[rand(count($symbol)-2, 20)])) {
            $default_content[] = $symbol[rand(0, count($symbol) - 1)];
        }
    }

    //設定字數大於20字,加入斷行
    if ($str_number > 20) {
        for ($i = 0; $i < rand(0, $str_number); $i++) {
            $br_ary[$i] = '<BR>';
        }
        //合併兩個陣列
        $new_ary = array_merge($default_content, $br_ary);
    }else {
        $new_ary = $default_content;
    }
    
    //陣列打亂
    shuffle($new_ary);

    //合成字串
    return implode("", $new_ary);
}


使用說明:
$rand = rand(100, rand(200, 700));
$subject_data = get_fake_content(20);
$content_data = get_fake_content($rand);
當標題使用時,不大於20個字數
當內文使用時,最少大於20個字數

程式分享:
https://github.com/liangyutw/fake_content

2017年2月5日 星期日

laravel 5 瀏覽器推播

此篇文章是引用來自:https://jigsawye.com/2015/12/22/push-notification-to-user-in-laravel-5/

文章內容經由小亮哥本人的實際操作結果有所不同,會在此做說明


使用環境:(僅供參考)

作業系統:CENT OS 7
伺服器:NGINX
PHP:7.0.14
框架:Laravel Framwork 5.1

前言:在要操作以下的工具前,請先確保你的 Laravel 專案 已經安裝完成可以執行


再次確認,作業系統裡已經裝好了 composer、npm 這兩個工具


安裝工具套件

先安裝 nodejs,安裝文章網址如下
https://www.phpini.com/linux/rhel-centos-install-node-js
再開始安裝相關套件(終端機 Terminal)
composer require predis/predis 
npm install express socket.io ioredis --save
安裝完成 predis,請看你的 composer.json 是否有
"require": {"php": ">=5.5.9",
 "laravel/framework": "5.1.*",
 "predis/predis": "^1.1"
},
安裝完成 express socket.io ioredis,請看你是否有這個資料夾,這裡面有剛剛安裝的程式工具在其中(終端機 Terminal)



還要安裝一個 Redis Server,安裝文章網址
http://sharadchhetri.com/2014/10/04/install-redis-server-centos-7-rhel-7/

來源文章中的某一段

$ php artisan migrate
$ php artisan make:auth
我這裡是沒有用到的

提示:redis 的 port 預設是 6379,nodejs 的 port 預設是 3000,請記得伺服器要開 port


需要執行的工具如下 

根據來源文章指示,請檢查是否執行
  • Laravel Application(Nginx or php artisan serve)
  • Redis server
  • 隊列監聽器(php artisan queue:listen)
到了這裡,簡單的說,你的 laravel 是可以正常跑出程式結果,redis 是可以用的


修改設定與新增程式

安裝好了工具,要設定 laravel 裡對應文件,與要執行的程式,先看到 .env 這個檔案
修改成
...
QUEUE_DRIVER=redis
BROADCAST_DRIVER=redis
...
接著到終端機(Terminal)執行
php artisan make:event PushNotification
將會在 app/Events 資料夾裡建立 PushNotification.php
請將以下的程式更新到剛建立好的 PushNotification.php 裡


<?php 
namespace App\Events;
use App\Events\Event;
use App\User;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class PushNotification extends Event implements ShouldBroadcast
{
    use SerializesModels;
    /**
     * @var string
     */
    public $token;
    /**
     * @var string
     */
    public $message;
    /**
     * Create a new event instance.
     *
     * @param User $user
     * @param      $message
     */
    public function __construct(User $user, $message)
    {
        $this->token = sha1($user->id . '|' . $user->email);
        $this->message = $message;
    }
    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['notification'];
    }
}
再來要建立 socket.js,原作者是放在專案的根目錄,將以下的 js code 貼上
var Redis = require('ioredis');
var redis = new Redis();
// 訂閱 redis 的 notification 頻道,也就是我們在事件中 broadcastOn 所設定的
redis.subscribe('notification', function(err, count) {
  console.log('connect!');
});
// 當該頻道接收到訊息時就列在 terminal 上
redis.on('message', function(channel, notification) {
  console.log(notification);
});
到了這裡,我們要做個測試,確定是否可以執行

先開一個新的終端機畫面,主要先執行 socket.js 這是核心程式,一定要能執行才能繼續下去

找到你存放 socket.js 的位置,執行
node socket.js


問題排除

如果這裡有 NOAUTH 的錯誤,就要先進行 Redis-cli 的密碼設定,開另一個root權限的終端機

請先執行

service redis restart
再執行
node socket.js
就會出現
Listening on Port 3000
connect! 
回到剛重啟 redis 的Terminal執行
redis-cli
它會出現 
127.0.0.1:6379>
輸入
CONFIG SET requirepass "你的密碼"
會出現
OK
再執行
AUTH "你的密碼"
如果出現錯誤訊息
(error) NOAUTH Authentication required.
再重啟 redis 的步驟下來


測試觸發事件

再開一個終端機(Terminal) 操作,記得要切到 laravel 專案底下,才能執行 artisan
php artisan tinker
輸入
event(new App\Events\PushNotification(App\User::first(), 'banana!'))
回到剛執行 nodejs 的那個 terminal 畫面,應該會看到
{"event":"App\\Events\\PushNotification","data":{"token":"long-hash-string","message":"banana!"}}
如果你已經可以執行到這裡,表示你已經完成的這個推播的功能,剩餘的就是自己再做修改調整成要的型態

到了這裡,你可接續原作者的

前端

這一段再往下做,這裡要補充的是,以下這段程式中
var io = require('socket.io-client');
// 建立 socket.io 的連線
var notification = io.connect('http://localhost:3000');
// 當從 socket.io server 收到 notification 時將訊息印在 console 上
notification.on('notification', function(message) {
  console.log(message);
});
我製作過程,沒有加入
var io = require('socket.io-client');
才能順利執行網頁 

2017年1月3日 星期二

Cent OS 7 SELinux enabled 時的資料夾設定

在學習程式的同時,也常常會接觸到一些主機上相關的設定,就像你可能想要把某個套件裝在你的 VM 裡或是神秘的環境裡面,在 CENT OS 7 當中有一些會常遇到的狀況,會讓你不知道為何不能執行套件,在這裡做個提醒

我這裡的環境是
CENT OS 7
SELinux 開啟

查看你的 SELinux  狀態

sestatus

你可能在主機裡的某個資料夾當中,上傳了一個套件資料夾


這時候,必須先把套件的資料夾擁有者、資料夾權限設定好

改擁有者 chown -R apache.apache
改權限 chmod -R 755 dokiwiki/ piwik/

提醒:你的權限要能修改才有作用

再來就是最重要的一個環節
因為我的 SELinux 是開啟的,所以要多做這件事情 (如果你的沒有開啟,你已經可以離開此頁面了)

那就先檢查檔案的 content type 長什麼樣子
執行

ll –Z /你的路徑/dokuwiki/

你會看到


如果紅色框裡的字,是長這樣 httpd_sys_content_t 就必須要做修改

chcon -R -h -t httpd_sys_script_rw_t /你的路徑/dokuwiki/

如此一來這個資料夾才可以被讀寫

--

另外再提醒一個有關 SELinux 的部份,使用

getsebool -a | grep httpd

可以列出有關 httpd 的 SELinux 設定有哪裡
其中要設定的是

開啟 db 連線
setsebool -P httpd_can_network_connect_db 1

有關 SELinux 的設定要多加小心,有出現錯誤警告或是必須要開啟的,再設定開啟,以免弄死自己,又害到別人

2016年12月28日 星期三

Laravel Storage::disk 磁碟實體操作

前幾天有個強者我朋友做了一個測試程式,分享出來,我就來測試使用,我們都使用目前最潮的 Laravel 框架來實作,但是我自己還沒用到 Laravel 當中的 操作磁碟 的部份,所以在朋友的程式當中,我遇到了錯誤

原本的程式:

建構式這裡用了 Storage::disk('public'); 但我在執行時就變成了

InvalidArgumentException in FilesystemManager.php line 109:Driver [] not supported.
後來仔細看了官網的文章,才發現要到 config/filesystems.php 裡面去加東西


打開這個 filesystems.php之後,約在 44行




     'local' => [  
       'driver' => 'local',  
       'root'  => storage_path('app'),  
     ],  

複製一份到下面,改成你要的內容
上面程式看到的是用 public 的名字,所以這裡也改成那個名字

     'local' => [  
       'driver' => 'local',  
       'root'  => storage_path('app'),  
     ],  
     'public' => [  
       'driver' => 'local',  
       'root'  => public_path('storage'),  
     ],  

那 root 後面的值,就看你想讓它進入哪個位置去抓檔案
這裡加上去之後,我的頁面就沒有出錯了

Lumen 微框架建立筆記

依官方文件操作 根據 lumen 的官方文件說明,先決條件是 PHP >= 7.1.3 OpenSSL PHP Extension PDO PHP Extension Mbstring PHP Extension 當然 composer 也是...