分类 lumen 下的文章

API下载 组装的 word 文档


Word文档生成有很多种方式,图简单,其实可以就按html排版,一键导出
网页直接导出,记得加上导出word约束的头($fileName,导出的文件名)

header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$fileName");

这种导出呢,样式和原生网页是有点问题,但注意单位和尺寸,就没有多大问题了,具体的要自己尝试

但现在的开发,基本上都是前后端分离,API方式调用,那怎么实现呢?

同样是调用地址就OK了吗?
不是的,直接调用网页的地址,发现没有反应,第一反应是不是API头部约束了什么,导致了不能直接下载原格式的word文档

琢磨了好久,没有成功,我换了一种思路,先把word文档保存起来,返回文档下载路径给API
期间我请求了一下API,居然可以正常返回了,但只是html代码,情况是我在准备保存word文档到本地的时候,去掉了头部约束,是header的影响

那能正常返回就好办了,两种方式
第一种,就是直接保存为word文档下载。
第二种,正常返回后,转为word文档保存。
第一种没有什么可谈的,容易理解也好办
第二种以Axios为例

function apiRequestDownload(url, filename, type, formData, config = {}) {
    return new Promise((resolve, reject) => {
        Axios({ url, responseType: "blob", method: type, data: formData,config })
            .then(result => {
                let fileURL = window.URL.createObjectURL(
                    new Blob([result.data], { type: '' })
                );
                let fileLink = document.createElement("a");

                fileLink.href = fileURL;
                fileLink.setAttribute("download", filename);
                document.body.appendChild(fileLink);

                fileLink.click();
                resolve(result);
            })
            .catch(err => {
                reject(err);
            });
    });
}

网站上线与迁移踩坑日志 class memcached not found


源起于,阿里云服务器快到期了,考虑服务器已运行多年,需要更新维护一下,再考虑续费费用问题,决定重新购买,进行项目的整体无差别移植。
看是简单的一件事,还是挺折磨人的。

1.首先要登录服务器吧,这里要注意,购买成功后,服务器没有设置密码,需要到控制台<重置实例密码>修改密码,其实就是设置密码,再进行登录。

2.进行软件安装,这里千万要注意了,要开启相应的端口,在控制台,服务器实例里面的安全组列表

这里的协议类型一般都是TCP,目的就是需要开启的端口段,如只开放8080就写8080/8080 ,授权对象就是指定可访问此端口的IP地址,若任意IP可以访问,则填写0.0.0.0/0

成功踩坑:阿里云没有默认开启80端口
问题是这样的,我最后上线了代码,发现只有SSL网站才可以正常访问。我是这样考虑的:以为是文件权限的问题,SSL比较安全嘛,文件权限高应该也可以正常访问。没有SSL的可能要放低权限,我就这样,就一直在权限上徘徊,一直报不能访问,ping又是可以ping通的,真是奇怪了。后面实在放心不下,再去看一看阿里云是不是默认就没有开启80端口。最后差点吐血,还真是这样的。
3.这些都可以了,上线laravel lumen项目时,可把我愁坏了,可以正常访问,但就是有错。
3.1这里要注意一点,是文件权限问题,linux系统对文件、目录权限敏感。由于lumen 要写运行日志,要把storage目录设置为www 的可写文件。由于laravel 直接访问public ,也要把public 放开www权限。
3.2配置这些你觉得应该是可以了,但告诉你,不是这样的,还早着呢。
你会发现,访问老是出错,什么错能,找不到相关数据库
成功踩坑:记得要加载env文件
踩坑开始,以为是数据库没有正确导入,数据库名称,用户名、密码没有填写正确,我还删除数据库,从新创建了两次,也特别对了.env文件多次。不是的,这些都是徒劳。
踩坑继续,后续突然发现,报错为,始终为找到forge用户,我思考再三,突然恍悟,我压根没有配置此用户呀!那什么情况会导致这样的情况发生呢,应该是默认配置文件,我全局搜一下DB_USERNAME,还真是的,在库文件vendorlaravellumen-frameworkconfigdatabase.php下,有这样的默认配置,forge用户就是在这的。
'mysql' => [

 'driver'    => 'mysql',
 'host'      => env('DB_HOST', 'localhost'),
 'port'      => env('DB_PORT', 3306),
 'database'  => env('DB_DATABASE', 'forge'),
 'username'  => env('DB_USERNAME', 'forge'),
 'password'  => env('DB_PASSWORD', ''),
 'charset'   => env('DB_CHARSET', 'utf8'),
 'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
 'prefix'    => env('DB_PREFIX', ''),
 'timezone'  => env('DB_TIMEZONE', '+00:00'),
 'strict'    => env('DB_STRICT_MODE', false),

],
百度查一下 结果是要清理缓存,语句是 php artisan config:clear 或直接php artisan clear。运行呢,报错误了。

咋!这怎么可能,还好我第一次丢过代码,否则只有继续踩坑了。如果你不知道,那你肯定会继续搜索,则出现的情况,好多同胞会热心回复你,安装memcached,咋咋的。这可不得了,问题就多了。
后续我才想到,应该是php配置文件不能正常加载env文件了。去php配置文件看一下,还真禁用了getenv方法,或putenv,放开就OK 了

关系到问题,服务器迁移应该选择再服务器用户不用的时间段,而且使用备用域名进行生产测试。必要时加上代码强制更新手段,发现Chrome浏览器缓存太严重,切换DNS后,浏览器反应总是迟钝,强制性刷新也不起作用。

可能关系到的语句
一台服务器进入另外一台服务器ssh root@ip地址
数据库备份 mysqldump -hlocalhost -uroot -p 需备份的数据库 > /... 备份位置
远程拷贝 scp -r root@IP地址:/远程地址 /现地址
编辑文件 vi .env 保存退出 :wq 不保存退出 :q! 未修改直接退出 :q
查找文件 find / -name 查找内容 /代表从跟目录开始查找
重启服务器 reboot
重启Apache service httpd start 或 stop | restart
查找进程 ps -ef | grep 进程名 杀死进程 kill -9 某进程


lumen 数据库操作 Cannot use object of type stdClass as array


你可能记得,操作数据库时
$dataList = 什么什么 ->get();
能查询到数据 数据结果为数组加stdClass类型

你使用 $dataList = $dataList->toArray();进行数据转化

结果你发现,没有正确转化,你再到里面去转化,但结果证明也是徒劳

foreach ($allData as $k=>$d){
     $ff = 'id';
     if(!is_array($d)){
           $d = $d->toArray();
     }
     $tempData[] = $d[$ff];
}

那怎么办呢?
要想到数据类型的转化
数组转对象,可以直接

$arr  //数组
$arr = (object)$arr;  //数组转对象

那反过来

$arr  //对象
$arr = (array)$arr;  //对象转数组

所以,以上代码可以改写为如下即可解决问题

foreach ($allData as $k=>$d){
     $ff = 'id';
     if(!is_array($d)){
           $d = (array)$d;
     }
     $tempData[] = $d[$ff];
}

邮箱发送问题,本地测试没有问题,拿到服务器上就出问题了


Trying to smtp.163.com: 25
Error: Cannot connenct to relay host smtp.163.com
Error: Connection timed

一看就是请求超时
经过多方查资料
觉得有这样一个人和我有一样的经历,但他没有我感受得深

是这样的,邮件发送
本地测试没有问题,拿到服务器上就出问题了
开始想到了端口 开启25端口,但还是一样

后面我猜就是应该是服务器上我配置了ssl证书,是https,就是这里出问题了,线上应该不能再用普通的非加密的传输

觉得有点麻烦,其实如这老兄说的,特简单

MAIL_HOST=ssl://smtp.163.com
MAIL_PORT=465

改成这样就OK了

如果不懂的,看一下这大神的:https://www.pianshen.com/article/7079792515/