nginx 配置问题
nginx 在执行 !-e $request_filename
或者 try_files $uri $uri/ /index.php$uri
的时候如果文件所在的文件夹没有执行权限会导致 nginx 认为文件不存在,遇到这种问题的时候,先查看文件夹权限。尤其是从别的地方下载的文件或者压缩包里解压出来的文件
nginx 在执行 !-e $request_filename
或者 try_files $uri $uri/ /index.php$uri
的时候如果文件所在的文件夹没有执行权限会导致 nginx 认为文件不存在,遇到这种问题的时候,先查看文件夹权限。尤其是从别的地方下载的文件或者压缩包里解压出来的文件
需求是用 HTML 生成 PDF 所以就找啊找
找了半天,有以下几个主流的库
试用之后,只有 dompdf 能比较完美的还原 css 样式
但是默认对中文支持不好。
暂时不知道怎么解决,百度搜到的全是 N 年前的解决方案,而且千篇一律 --
UPDATE:
下午看 dompdf 项目的时候,发现一个项目 https://github.com/dompdf/utils 。
这个项目就是用来导入其他字体的,我用它导入了微软雅黑。
这个工具 依赖 https://github.com/PhenX/php-font-lib 和 https://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 中的设置显示。
自动加载简单考虑的话,需要一个数组存放自动加载目录。
并使用系统函数spl_autoload_register注册自定义的自动加载函数。
自动加载要符合psr规范
<?php
/**
* 自动加载类
*/
class Loader
{
// 自动加载搜索目录
private static $loadPaths = [];
// 添加自动加载路径
public static function addAutoLoadPath($path)
{
self::$loadPaths[] = $path;
}
// 注册自动加载函数
public static function register()
{
spl_autoload_register('self::autoload');
}
// 自动加载函数
public static function autoload($className)
{
$className = str_replace(['\\', '_'], DIRECTORY_SEPARATOR, $className);
foreach (self::$loadPaths as $loadPath) {
$loadPath = rtrim($loadPath, DIRECTORY_SEPARATOR);
$path = $loadPath . DIRECTORY_SEPARATOR . $className . '.php';
if (self::import($path)) {
break;
}
}
}
// 包含一个已存在的文件
public static function import($path)
{
return file_exists($path) ? include_once($path) : false;
}
}
有这个类之后,配合前文中的入口文件,就可以继续了。
接下来我们需要一个路由。
不知道我的步骤对不对 反正就记在这了。
先简单介绍下我的目录规划,以后会有所变动,现在一切从简。
/
---app
---Controller
Home.php
---Config
---local
db.php
...
---Model
...
---system
Loader.php
Uri.php
Route.php
Config.php
---runtime
...
index.php
第一步:入口文件;
一件很重要的事情,原因看注释。
<?php
// 修正cli模式下运行目录不同部分系统函数取值不同的问题 比如: getcwd
defined('STDIN') AND chdir(__DIR__);
定义一些必要的常量
<?php
define('APP_FOLDER', 'app');
define('SYSTEM_FOLDER', 'system');
define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);
define('APP_PATH', ROOT_PATH . APP_FOLDER . DIRECTORY_SEPARATOR);
define('SYSTEM_PATH', ROOT_PATH . SYSTEM_FOLDER . DIRECTORY_SEPARATOR);
然后要手动导入自动加载类,并且添加自动加载路径,注册自动加载函数。
这样之后的类就可以自动加载了。
include SYSTEM_PATH . 'Loader.php';
Loader::addAutoLoadPath(SYSTEM_PATH);
Loader::addAutoLoadPath(APP_PATH);
Loader::register();
下一篇是Loader类的具体实现。
1、以管理员身份登录mysql
mysql -u root -p
2、选择mysql数据库
use mysql
3、创建用户并设定密码
insert into user (Host,User,Password) values ('localhost', 'test',password('1234'))
4、使操作生效
flush privileges
5、为用户创建数据库
create database testdb
6、为用户赋予操作数据库testdb的所有权限
grant all privileges on testdb.* to test@localhost identified '1234'
7、使操作生效
flush privileges
8、用新用户登录
mysql -u test -p