阿里云升级php,编译报内存不足的另类解决办法

本人比较爱看“免费的”网文小说,但是这类小说的网页往往挂着很多外链广告,这些广告会遮挡文字 或是 让人不小心点击 或者 必须 点击后才能继续看。尤其是不适合出现在公共场合的广告。上下班路上通勤时长较长的情况下,那么多人挤在地铁上,没准别人无意扫了一眼你的手机屏幕,就看到了页面上不小心弹出的私密广告。即使你不在乎,但是想看个小说,每次点下一页的时候必须先点一下广告,也很烦人的。

为了解决这个烦人的问题,本人自己写了个爬虫,代码放到了自己的阿里云服务器上。由于小说还在连载中,需要每天都爬一遍,为了省事儿,就写了个 crontab 每天一爬。

之前爬取程序出了问题,为了调试,在本地环境中进行了代码调整。调完后,发布到线上发现程序执行失败了。经过一番检查发现是mysql链接问题。因为本地开发环境用的是php7.x 版本,而阿里云上用的还是php5.x。本地调试造成了版本php代码的版本兼容问题。

于是就想着升级下阿里云上的php版本。官网下载php8的源码,编译安装。make过程中有报错,按照提示更新了各种依赖后,出现了一个内存不足的bug。内存不足怎么解决?为了升级php,扩容阿里云配置?那不得多花钱吗。。。本身买阿里云只是为了学习以及测试用,买的是最低配最便宜的 ——大家都不富裕,生活都很简洁这点应该都能理解!

网上搜索有没有解决办法,还真有!说是使用虚拟内存能够解决,按照网上的教程创建了swap,结果make 一条以后直接停住不动了。 试了很多次还是不行!

扩展虚拟内存行不通,能不能用其他方式?

想到本地环境是用的docker-desktop,当年自学 docker 的时候也在阿里云上搭建过。就想能不能把本地的镜像直接方阿里云的docker里,然后阿里云上改用docker容器跑php7。

想到就干,将本地运行中的docker容器进行进行备份、归档,然后拉到云服务器上load。nginx配置中修改php的端口,将php项目文档的路径与容器路径进行对应挂载(第一次忘了挂载路径,造成php报找不到文件的错误:filed not found)。重启nginx后,打开 https://www.2pea.com/ 发现页面空白。

查找原因是因为 geoip 扩展没有安装。之前由于总是有国外ip请求服务器,为了屏蔽他们,专门安装了geoip进行ip过滤,如果是国外ip请求,直接返回“中国邢台欢迎您!”(这里吐槽下geoip库免费版的已经停止维护了,所以geoip屏蔽的可能并不准确)。这次从本地拿的php7镜像里面没有geoip扩展,造成相应函数不可用的错误。

安装了geoip扩展后,再打开 https://www.2pea.com/ ,发现还是不行!继续查,发现还有redis链接问题。为了安全,redis没有开通远程链接功能,从容器里访问云服务器上的redis服务访问不到。于是将redis加了密码,设置成可远程访问。 再打开 https://www.2pea.com/ ,啧,nice!

浏览器端调用百度地图API,但地图无显示

调用JavaScript API,地图无显示解决方案

在刚学百度地图——JavaScript API时,在细节上犯了许多错误。在此一并整理, 希望大家能少走弯路。
许多同学刚接触时,希望的结果是这样的:
null
但实际很可能是这样:
null
下面来总结一下可能是哪些原因呢?

1、未输入AK((Access Key)或类型错误

百度地图开发文档-JavaScript API
百度示例demo-地图展示
null
将ak替换成自己的密钥,注意自己使用的密钥类型,若在浏览器端显示,不要错误地使用了“服务端”、“微信小程序”等类型。

2、路径有误(url未添加http:或https:)
null
百度地图的示例自然可以调用成功;
如果切换到自己的HTML文件中,需要在src这里添加上http:或https:
null
否则就会出现地图调用失败——一片空白:
null

3、JavaScript文件——<script>放置不合理

很多人习惯于在<head>部分放一个<script>标签;
这种做法一般来讲是没有什么太大问题,但实际上:位于<head>块中的脚本会导致浏览器此时无法并行加载其他文件(如图像/其他脚本),也就是说它必须做完这件事,才可能去完成接下来的工作。如果在这一步卡住,那结果就显而易见了。
(不太推荐下图做法,密钥文件例外)

null

最好还是把<script>标签放在HTML文档的最后,</body>标签之前:
(放在</html>标签之后也没问题)
这样能使得浏览器更快地加载页面

(百度密钥的文件位置可保持不变,仍旧放在<head>内部;
但其必须是最前面的位置,在其他js文件之上,它是完成百度地图所有操作的基础)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    ...
    <script src="file.js"></script>
</body>
</html>

null
4、地图名称不一致

确保HTML文件里的名称与JavaScript里创建的地图实例一致
null
null

对第2点和第4点进行补充说明:
包含地图调用的js文件,第1行代码是:

var map = new BMap.Map("practice"); 

意思是查找id为practice的元素,在里面创建地图
而id为practice这个div元素是在<body>里面出现
如果把js代码放前面,则先执行语句,但因为没能获取该元素,所以地图显示失败)

5、被其他标签遮挡或隐藏(样式问题)
确保的以上四点都没问题,如果还是看不到地图,那就研究下载入地图的时候,自己是不是在外层又套上了新的<div>等标签,要确保外层标签没有 display:none; 或者 height:0px;

原文链接:https://blog.csdn.net/MRWu007/article/details/105527434/

crontab不能正常执行的五种原因

centos 安装crontab:

yum install crontabs

安装后不执行:
1 crond服务未启动

crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:

crond

service crond start
2 权限问题

比如:脚本没有x执行权限,解决方法:

增加执行权限,或者用bash abc.sh的方法执行

3 路径问题

有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行

./test.sh

就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:

/root/test.sh

4 时差问题

因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。

5 变量问题

有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。

6 莫名其妙的问题

我最近刚发现一种情况,crontab不执行,crontab -l可以看到计划列表,一切正常,但是就是不执行。

crontab -e后不做任何修改直接保存,提示:crontab: installing new crontab,然后计划任务恢复正常。

文章来源:https://www.yubosun.com/article/JMrAUVC5.html