MAC RVM 安装 Ruby编译报错问题解决

之前在自己的老MAC上通过RVM安装Ruby报错,查看错误信息:mjit_compile.inc:3385:73: error: expected ‘)’ ; https://github.com/rvm/rvm/issues/4927 和这个issues描述的一样。 前几天在自己的新MAC上安装一切正常。想起来以前在/usr/local/include 目录下ln过MacOSX.sdk的头文件到该目录下,尝试删除这些链接过来的头文件。

ls -la | grep CommandLine | awk -F " " '{print $9}' | xargs rm

重新执行 :

rvm install "ruby-2.6.5" --with-openssl-dir=`brew --prefix openssl`

安装成功。

同时发现;Golang test 时候 Golang test error: macro expansion producing ‘defined’ has undefined behavior [-Werror,-Wexpansion-to-defined] 报错也消失。

Mac 安装 RVM

RVM 用于管理 Ruby 版本的工具,类似pyenv

官网: https://rvm.io/

根据官网的介绍,先执行:

gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

执行报错:zsh: command not found: gpg2

发现这个gpg2可以不同配置,直接执行下一步

\curl -sSL https://get.rvm.io | bash
source /Users/farmer/.rvm/scripts/rvm

这样rvm就安装好了。

rvm list # 查看当前系统已经安装的ruby版本
rvm list known # 查看可以安装的ruby版本

通过RVM安装ruby

rvm install 2.6.6

Golang test error: macro expansion producing ‘defined’ has undefined behavior [-Werror,-Wexpansion-to-defined]

今天用Go语言开发过程中,执行测试用例发现如下错误:

go test -v ./services/

# runtime/cgo
In file included from gcc_darwin_amd64.c:6:
/usr/local/include/pthread.h:331:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]
/usr/local/include/pthread.h:200:2: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
/usr/local/include/pthread.h:331:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]
/usr/local/include/pthread.h:200:34: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
/usr/local/include/pthread.h:540:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]
/usr/local/include/pthread.h:200:2: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
/usr/local/include/pthread.h:540:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]
/usr/local/include/pthread.h:200:34: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'

https://github.com/golang/go/issues/38876 在这个上面找到了类似的问题

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install

尝试里面说的 重新安装 xcode 命令行工具,并没有解决问题。

export CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-builtin-requires-header"

尝试修改CGO_CPPFLAGS变量后问题解决。

猜想可能是哪次 link 过一些头文件到 /usr/local/include/目录引起的。具体原因也不知道,不改再尝试了,可能把其它环境弄坏,暂时解决就好。

Python SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”,)

Mac 升级 openssl 后,Python可能就会出现这个错误;原因是升级openssl过程中导致库文件的链接路径发生变化

在Python 命令行输入

import ssl
Traceback (most recent call last):
   File "", line 1, in 
   File "/Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/ssl.py", line 101, in 
     import _ssl             # if we can't import it, let the error propagate
 ImportError: dlopen(/Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
   Referenced from: /Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
   Reason: image not found

可以发现是因为/usr/local/opt/openssl/lib/libssl.1.0.0.dylib无法加载导致的,修复这个问题只需要让Python能够正常加载到这个库,因此需要重新创建libssl.1.0.0.dylib链接。

cd /usr/local/opt/openssl/lib/


发现目录下并没有 libssl.1.0.0.dylib,只有 1.1 的库,如果已经安装了openssl1.0则直接link到这个目录,否则需要先安装openssl 1.0

我的电脑上已经安装了openssl1.0 并且也有 libssl.1.0.0.dylib库文件,只是目录在:/usr/local/opt/openssl@1.0/lib

因此只需要执行:

ln -s /usr/local/opt/openssl@1.0/lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

import ssl
Traceback (most recent call last):
File “”, line 1, in
File “/Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/ssl.py”, line 101, in
import _ssl # if we can’t import it, let the error propagate
ImportError: dlopen(/Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
Referenced from: /Users/farmer/.pyenv/versions/3.6.2/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
Reason: image not found

重新执行import ssl 测试出现了另外一个错误,可以看出来还是相同问题,继续执行

ln -s /usr/local/opt/openssl@1.0/lib/libcrypto.1.0.0.dylib
 /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib

再次验证,解决。

PHP curl 设置请求头

正确做法

        $header = array(
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection: keep-alive',
            'Upgrade-Insecure-Requests: 1'
        );

错误做法

        $header = array(
            'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language' => 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection' => 'keep-alive',
            'Upgrade-Insecure-Requests' => '1'
        );

LNMP 升级与多版本PHP

今天在部署opencart3.6的时候提示:PH7.3+ Required,为了下次不用在去百度,特意把LNMP的升级与多版本PHP的步骤记录下来。

0、升级到指定的LNMP,执行下列指令将自动升级 lnmp

wget -c http://soft.vpser.net/lnmp/lnmp1.7.tar.gz && tar zxf lnmp1.7.tar.gz && cd lnmp1.7 && ./upgrade1.x-1.7.sh

1、添加多个版本的PHP,输入指定的PHP版本后完成安装

./install.sh mphp

2、安装完成后可以在nginx的conf目录下看到 enable-phpX.X.conf

3、在需要其它版本的网址的nginx引入对应的 include enable-phpX.X.conf

微信小程序使用xdebug进行调试

建立博客的初衷,本来是想学习大佬们经常分享些博客,但是经常半天憋不出100个字,大佬们真不容易。

在做PHP项目时候用xdebug进行调试,如果使用浏览器我一般直接 Xdebug Helper 浏览器插件。配合PHPSTORM进行调试。

前几天给个朋友修改微信小程序的时候发现小程序开发工具 (应该是基于
chromium 开发的) 不能安装浏览器插件,所以需要另想办法。 根据xdebug调试的原理也很快的找到了方案。只需要在 微信小程序的 request 里加上 cookies 头 (不能直接使用浏览器的cookies因为小程序并不支持cookies)

wx.request({
url: '',
header: {'Cookie': 'XDEBUG_SESSION=PHPSTORM’
})

一种 Linux JAVA进程突然消失的原因

有时候会遇到JAVA程序在服务器上运行一段时间后进程突然没有了,查看JAVA应用的日志并没有任何的异常。

这时候应该优先想到进程是不是被操作系统Kill掉了,查看操作系统日志:

cd /var/log/
# 查看 messages 文件
cat messages* | grep java

如果看到类似如下信息说明由于操作系统内存剩余太低,JAVA进程被操作系统干掉了:

Apr 15 20:57:50 iZuwucrzorhw2yZ kernel: java invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: java cpuset=/ mems_allowed=0
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: CPU: 0 PID: 2793 Comm: java Not tainted 3.10.0-693.2.2.el7.x86_64 #1
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: [ 1356]     0  1356   629574    17847      94        0             0 java
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: [ 3804]     0  3804   886644    19509     113        0             0 java
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: [ 2676]     0  2676   894623    85673     278        0             0 java
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: [ 2754]     0  2754   965673    40515     362        0             0 java
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: [14208]     0 14208  3051253   108737    4500        0             0 java
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: Out of memory: Kill process 14208 (java) score 113 or sacrifice child
Apr 15 20:57:51 iZuwucrzorhw2yZ kernel: Killed process 14208 (java) total-vm:12205012kB, anon-rss:434948kB, file-rss:0kB, shmem-rss:0kB

这种问题通常发生下内存较低的服务器下,操作系统为了保护内存能够支持自己运行,将JAVA进程杀掉。

找到了运营自然好解决,通过分为2种情况:

  1. JAVA程序有内存泄露问题, 这种情况那就通过JAVA内存分析工具 定位内存泄露的位置,然后修复。
  2. 服务器内存太低, 这种情况还是升级服务器吧。

通用的程序启动/停止Shell脚本

告别Shell命令恐惧症,你需要的是这个『启动、停止Shell』脚本,下面是个php-fpm的启停脚本

#!/bin/bash

SHELL_DIR=$(cd "$(dirname "$0")";pwd)
opt="${@:2}"
echo "shell dir: $SHELL_DIR, arguments:$opt"

psid=

checkpid() {
   psid=`ps -ef | grep 'php-fpm' | grep -v 'grep' | grep -v 'sh' | awk '{print $2}' | tr '\n' ' '`
   echo "psid: $psid"
}

start() {
     echo "starting..."
     checkpid
      if [ ${#psid} -ne 0 ]; then
         echo "================================"
         echo "warn: php-fpm already started! (pid=$psid)"
         echo "================================"
      else
         echo "============ Start ============="
         echo "starting php-fpm ..."
         php-fpm $opt
         checkpid
         if [ ${#psid} -ne 0 ]; then
            echo "php-fpm started successfully!"
         else
            echo "php-fpm started failed!"
         fi
     fi
}

stop() {
   checkpid
    if [ ${#psid} -ne 0 ]; then
       echo "killing pid -> "$psid
       kill -9 $psid
         checkpid
         if [ ${#psid} -ne 0 ]; then
            echo "php-fpm stopped failed!"
         else
            echo "php-fpm stopped successfully!"
         fi
   else
      echo "================================"
      echo "warn: php-fpm is not running!"
      echo "================================"
   fi

}

status() {
   checkpid
   if [ ${#psid} -ne 0 ];  then
      echo "php-fpm is running!"
   else
      echo "php-fpm is not running!"
   fi
}

echo "running $1 command as $USER"

case "$1" in
   'start')
      start
      ;;
   'stop')
     stop
     ;;
   'restart')
     stop
     start
     ;;
   'status')
     status
     ;;
  *)
     echo "Usage: $0 {start|stop|restart|status}"
     exit 1
esac
exit 0