用 deployer 发布 laravel 项目的最简配置

用 deployer 发布 laravel 项目的最简配置

<?php
namespace Deployer;

require 'recipe/laravel.php';

// Set configurations
set('app_name', 'app_name');    // 应用名称
set('writable_mode', 'chown');
set('writable_use_sudo', true);
set('writable_recursive', true);

set('repository', 'ssh://git@githu.com:/xxx.git');  // git 地址,要能从目标机器上访问到

// Configure servers
host('prod')
    ->hostname('host')  // 域名或者 ip
    ->user('user')  // 发布的用户名
    //->identityFile('~/.ssh/id_rsa')   // 公钥
    ->stage('production')
    ->set('deploy_path', '/data0/{{app_name}}/{{stage}}')   // 路径随便修改
    ->set('branch', 'master'); // 要发布的分支

// 加速 composer install
desc('Copy vendor directory optimized the composer install');
task('deploy:copy', function () {
    if (has('previous_release')) {
        run('cp -R {{previous_release}}/vendor {{release_path}}/vendor');
    }
});

desc('Restart php-fpm on success deploy');
task('php-fpm:restart', function () {
    // 这个命令按照实际情况修改
    run('service php7.2-fpm restart');
});

before('deploy:vendors', 'deploy:copy');
after('deploy:symlink', 'php-fpm:restart');

// 如果需要的话开启
// after('php-fpm:restart', 'artisan:horizon:terminate');

Install PHP 7.1 on Ubuntu

1. 先添加 ppa:ondrej/php 源

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

如果找不到 add-apt-repository 命令则执行

sudo apt-get install software-properties-common

2. 安装 PHP7.1

sudo apt-get install php7.1 php7.1-common
sudo apt-get install php7.1-fpm php7.1-curl php7.1-xml php7.1-zip php7.1-gd php7.1-mysql php7.1-mbstring

3. 验证

php -v

4. 移除旧的 PHP 版本(可选)

sudo apt-get purge php7.0 php7.0-common

.....

参考 https://ayesh.me/Ubuntu-PHP-7.1

PHP 官方文档中 RecursiveArrayIterator 的例子

PHP 官网文档在介绍 RecursiveArrayIterator 时候举了一个例子,其中用到了 iterator_apply 这个函数。

然后我就去查了下 iterator_apply 的用法,介绍是这样说的:

iterator_apply — 为迭代器中每个元素调用一个用户自定义函数

当然 回调函数中如果不返回 true 迭代就会终止。

那个例子是这样写的

$myArray = array( 
    0 => 'a', 
    1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))), 
    2 => 'b', 
    3 => array('subA','subB','subC'), 
    4 => 'c' 
); 

$iterator = new RecursiveArrayIterator($myArray); 
iterator_apply($iterator, 'traverseStructure', array($iterator)); 

function traverseStructure($iterator) { 
    
    while ( $iterator -> valid() ) { 

        if ( $iterator -> hasChildren() ) { 
        
            traverseStructure($iterator -> getChildren()); 
            
        } 
        else { 
            echo $iterator -> key() . ' : ' . $iterator -> current() .PHP_EOL;    
        } 

        $iterator -> next(); 
    } 
}

所以我有点懵逼,既然函数里面做了循环,并且没返回 true,说白了函数只调用了一次,为啥不能好好调一次函数,非要搞这些骚东西。。。

如果把例子中的函数改成这样的话,虽然看起来更复杂了,但是这样才能体现出使用 iterator_apply 函数的意义。如下:

function traverseStructure($iterator) {
    if ( $iterator -> hasChildren() ) {
        $children = $iterator->getChildren();
        iterator_apply($children, 'traverseStructure', [$children]);
    } else {
        echo $iterator -> key() . ' : ' . $iterator -> current() .PHP_EOL;
    }

    return true;
}

nginx 配置问题

nginx 在执行 !-e $request_filename 或者 try_files $uri $uri/ /index.php$uri 的时候如果文件所在的文件夹没有执行权限会导致 nginx 认为文件不存在,遇到这种问题的时候,先查看文件夹权限。尤其是从别的地方下载的文件或者压缩包里解压出来的文件

PHP 输出 PDF 文档

需求是用 HTML 生成 PDF 所以就找啊找
找了半天,有以下几个主流的库

  1. tcpdf
  2. html2pdf
  3. dompdf

试用之后,只有 dompdf 能比较完美的还原 css 样式
但是默认对中文支持不好。
暂时不知道怎么解决,百度搜到的全是 N 年前的解决方案,而且千篇一律 --

UPDATE:
下午看 dompdf 项目的时候,发现一个项目 https://github.com/dompdf/utils
这个项目就是用来导入其他字体的,我用它导入了微软雅黑。
这个工具 依赖 https://github.com/PhenX/php-font-libhttps://github.com/PhenX/php-svg-lib
我是把 https://github.com/dompdf/utils 下载到 dompdf 的根目录下使用的
执行 php load_font.php font_name /path/to/font.ttf 会在 dompdf/lib/fonts/ 下生成 以 font_name 命名的两个文件。这时候就可以在生成的 PDF 里愉快的显示中文了。
不过执行上述命令时,会报错

PHP Warning: require_once(/Users/jiayx/workspace/fdd/trade-center/vendor/dompdf/dompdf/lib/php-font-lib/src/FontLib/Autoloader.php): failed to open stream: No such file or directory in /Users/jiayx/workspace/fdd/trade-center/vendor/dompdf/dompdf/autoload.inc.php on line 20

这种情况需要把 php-font-lib 和 php-svg-lib 复制一份到 dompdf/lib/ 目录下,他俩在 vendor/phenx/ 下
然后再执行上述命令,这时候就成功了。(虽然还是会报一堆 warning --

示例代码

<?php

use Dompdf\Dompdf;
use Dompdf\Options;

$html = '<html>......</html>';

$options = new Options();
// 是否加载远程文件 比如互联网上的图片、字体等。
$options->setIsRemoteEnabled(true);
// 这个不能没有
$options->setIsFontSubsettingEnabled(true);
// 设置字体
$options->setDefaultFont('msyh');    

$dompdf = new Dompdf($options);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4');
$dompdf->render();
// 第二个参数加上可以在 chrome 上预览 PDF,比较方便,不加会直接下载
$dompdf->stream('收款清单', ["Attachment" => 0]);

遇到的一个小问题:
不能 在 html 里设置 font-family 否则会按照 html 中的设置显示。