分類目錄歸檔:技術(shù)分享

解決CentOS下PHP system命令unoconv轉(zhuǎn)PDF提示”Unable to connect or start own listener”

centos系統(tǒng)下,用php的system命令unoconv把word轉(zhuǎn)pdf時(shí)提示Unable to connect or start own listene的解決辦法

unoconv -o /foo/bar/public_html/upload/ -f pdf /foo/bar/public_html/upload/test.docx 2>&1
上面這個(gè)命令在shell 終端能執(zhí)行成功,但是在php(Apache)中會(huì)報(bào)錯(cuò):Unable to connect or start own listene

只需要先設(shè)置HOME變量即可:
passthru(‘export HOME=/foo/bar/public_html/upload/ && unoconv -o /foo/bar/public_html/upload/ -f pdf /foo/bar/public_html/upload/test.docx 2>&1’)

Keep-Alive中通過component多次加載同樣的動(dòng)態(tài)組件無法保持狀態(tài)的解決辦法

問題描述

項(xiàng)目功能上有需要?jiǎng)討B(tài)添加組件的需求,比如tab標(biāo)簽功能,動(dòng)態(tài)添加標(biāo)簽,同時(shí)添加后的標(biāo)簽在切換時(shí)需要保存狀態(tài),自然而然想到了keepalive,這就有了下面的代碼:

一、tabPage 定義方式1:

通過components事先定義好所有會(huì)加載的組件:


tagPage
通過ref或computed的方式判斷當(dāng)前的標(biāo)簽的類型并返回:


這個(gè)時(shí)候
keep
alive是工作的,但這里的問題是:

動(dòng)態(tài)創(chuàng)建的組件有多個(gè)是同一個(gè)組件,比如APIAdd,

由于keep?alive的緩存機(jī)制是通過組件名稱來緩存的,同一個(gè)組件被打開多次的話其實(shí)顯示的還是第一次打開的那個(gè),這和我們實(shí)際的應(yīng)用場(chǎng)景不符合,不能緩存界面狀態(tài)(比如表單中輸入的內(nèi)容)

二、tabPage 定義方式2

為了解決方式1中的同名組件只能加載一次的問題,需要同一個(gè)組件被加載多次,只是里面展示的內(nèi)容不一樣,所以tabPage通過defineAsyncComponent異步加載:


這里組件能加載成功,同名組件每次創(chuàng)建標(biāo)簽都會(huì)生成一個(gè)新的,但是這里的問題是:

沒有起到keepalive的效果,已經(jīng)加載的組件,在切換時(shí)又重新創(chuàng)建了組件,?狀態(tài)自然也沒有得到保存,

解決辦法:

為了解決同一個(gè)組件可以被動(dòng)態(tài)加載多次,同時(shí)需要能keepalive,解決的辦法就是不用component,而是把所有動(dòng)態(tài)添加的組件都各自放在一個(gè)keepalive中,根據(jù)條件切換顯示即可:


這樣每個(gè)組件都可以加載自己的數(shù)據(jù),并且可以
keep
?alive保存狀態(tài):

Windows安裝cygwin + swoole,并配置crontab定時(shí)任務(wù)

一、Windows安裝cygwin

  • 安裝包下載

自行搜索安裝包進(jìn)行下載,目前官網(wǎng)無法打開。官網(wǎng)地址:http://www.cygwin.com/

  • cygwin安裝詳細(xì)教程

1. 打開安裝包:setup-x86_64.exe

2. 點(diǎn)擊“下一頁”,選擇第一種方式后再點(diǎn)擊“下一頁”

3. 更改安裝目錄為D:\cygwin64后,點(diǎn)擊“下一頁”

4. 選擇組件包的存放位置,設(shè)置為D:\cygwin64\package,然后點(diǎn)擊“下一頁”

5. 選擇連接方式,選擇第二種方式后點(diǎn)擊“下一頁”

6. 由于網(wǎng)絡(luò)原因可能會(huì)出現(xiàn)以下情況,點(diǎn)擊“確定”即可

7. 在User URL中輸入http://mirrors.163.com/后點(diǎn)擊“Add”,并選擇它點(diǎn)擊“下一頁”

8. 進(jìn)入下載包的頁面,如下圖所示。在Search中輸入需要下載的包并選擇版本,第三張圖片展示了所需要的組件,將這些組件選中后點(diǎn)擊“下一頁”,如果遺漏了某一個(gè)組件也不用卸載cygwin,只需要再次打開安裝包,按上述步驟執(zhí)行到此處,進(jìn)行搜索遺漏的組件進(jìn)行選中,然后再次下載即可。

9. 最后選中創(chuàng)建快捷方式并點(diǎn)擊“完成”

  • 配置環(huán)境變量

1.?在Windows系統(tǒng)下找到【編輯系統(tǒng)環(huán)境變量】,添加系統(tǒng)變量的路徑

2.?添加到該安裝文件夾中的bin文件夾下

  • 檢驗(yàn)Cygwin是否安裝成功

打開cygwin快捷方式(即命令行),輸入cygcheck -c cygwin

測(cè)試gcc、gdb是否安裝成功

  • 安裝apt-cyg(安裝后能夠像Linux系統(tǒng)一樣使用apt-get install/remove命令安裝卸載軟件)()

1. 下載之后解壓文件

2. 打開Cygwin,輸入apt-cyg install/remove vim即可安裝/卸載

二、安裝PHP swoole擴(kuò)展

swoole?下載地址(官網(wǎng)下載的文件試過后不能安裝,所以推薦下面):

https://gitee.com/swoole/swoole/tags

注意:5.0以上版本適用于PHP8

PHP7建議使用4.x系列的版本。

我這里下載的是swoole-v4.8.13

  • 將下載的swoole-v4.8.13解押后(也可以直接通過sourcetree克隆不用解押),放到C:\cygwin64\home文件夾中

  • 打開前面安裝的?Cygwin64?Terminal?命令窗口

    進(jìn)入到?D:\cygwin64\home\swoole位置

  • 打開Cygwin64安裝程序,搜索php-devel后安裝

  • 安裝完成后,執(zhí)行phpize

  • 編譯./configure

  • 執(zhí)行make

時(shí)間會(huì)比較長(zhǎng)

如果出現(xiàn)以下錯(cuò)誤:

則需要再打開Cygwin安裝程序重新安裝擴(kuò)展libpcre2-devel、pcre2

  • 再次輸入 make、make test、 make install 命令

  • 手動(dòng)打開 “/etc/php.ini” ,添加擴(kuò)展 ” extension=swoole.so”

?

  • 運(yùn)行 php -m查看擴(kuò)展是否開啟

  • 測(cè)試運(yùn)行:進(jìn)入/home/swoole/examples/http目錄下,執(zhí)行php server.php運(yùn)行?“server.php”,在瀏覽器中輸入http://127.0.0.1:9501/,看到以下界面就表示Swoole已經(jīng)運(yùn)行成功了

?

三、配置crontab定時(shí)任務(wù)

  • 安裝并配置crontab定時(shí)任務(wù)

1. 右鍵以管理員身份打開Cygwin,安裝cron服務(wù),執(zhí)行以下命令

cygrunsrv -I cron -p /usr/sbin/cron -a -D

2.?安裝完服務(wù)之后,需要運(yùn)行以下命令啟動(dòng)服務(wù)(此處執(zhí)行可能會(huì)有錯(cuò)誤cygrunsrv -S cron 報(bào)錯(cuò):error starting a service :QueryServiceStatus:Win32 error 1062.)

cygrunsrv -S cron

3.?執(zhí)行cron-config 重新安裝配置crontab

please enter the password for user ‘a(chǎn)dministrator’: (此時(shí)輸入的密碼(使用系統(tǒng)賬戶的密碼)是看不到的,沒關(guān)系直接輸入;再reenter(重新輸入)

4. 按win+R打開運(yùn)行頁面,輸入services.msc后進(jìn)入服務(wù)

5. 找到Cron daemon雙擊打開屬性列表,選擇“自動(dòng)”并且啟動(dòng)該服務(wù)(這樣做是防止該服務(wù)沒有被啟動(dòng))

6.?配置定時(shí)任務(wù)的命令介紹

crontab -e #編輯任務(wù)

crontab -l #查看任務(wù)列表

crontab -r #刪除任務(wù)

cronevents #查看執(zhí)行情況

7. 創(chuàng)建shell腳本vim /home/cron.sh

8. 使用crontab -e來創(chuàng)建定時(shí)任務(wù)

crontab設(shè)定時(shí)程表的格式說明:

執(zhí)行crontab -e配置定時(shí)任務(wù)(每天凌晨1點(diǎn)執(zhí)行home目錄中的cron.sh腳本):00 01 * * * sh /home/cron.sh

10.?使用crontab -l來查看,如下圖

11. 使用cronevents查看任務(wù)執(zhí)行情況

macOS monterey 升級(jí)后安裝php

macOS monterey已經(jīng)完全移出了php,不再默認(rèn)包含;升級(jí)后需要自行安裝:

可以通過brew install 的方式安裝php,但是通過該方法安裝的php又無法和默認(rèn)的apache配合使用,會(huì)包簽名錯(cuò)誤: No code signing authority for module at /opt/homebrew/Cellar/php/8.0.12/lib/httpd/modules/libphp.so specified in LoadModule directive.

當(dāng)然可以采取對(duì)so代碼自簽名的方式,但實(shí)際上這不是最好的辦法,因?yàn)閎rew install 安裝的php和mac默認(rèn)自帶的apache之間會(huì)由于各種依賴庫的問題無法跑起來

最好的辦法就是停用默認(rèn)的apache,然后apache和http完完全全都采用brew 來安裝brew 會(huì)把依賴的各種包自行安裝好

  1. sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
  2. brew install php
  3. brew install httpd

注意brew 安裝后的提示,相應(yīng)的環(huán)境變量PATH都按安裝后的提示設(shè)置,最好brew services start 對(duì)應(yīng)的服務(wù)即可

gitlab 升級(jí)步驟

小版本升級(jí),比如12.3.xx 升級(jí)到12.4.xx, 但是注意提示,如果升級(jí)不了會(huì)提示的:

gitlab preinstall: It seems you are upgrading from major version 13 to major version 14.

gitlab preinstall: It is required to upgrade to the latest 13.12.x version first before proceeding.

gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths

  1. 下載rpm包,可以從這里下載https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 根據(jù)自己的系統(tǒng)選擇對(duì)應(yīng)的版本
  2. gitlab-ctl stop unicorn
  3. gitlab-ctl stop sidekiq
  4. gitlab-ctl stop nginx
  5. rpm -Uvh gitlab-ce-10.8.7-ce.0.el7.x86_64.rpm
  6. gitlab-ctl restart
  7. 查看升級(jí)后的版本號(hào) cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

慎用json_decode的assoc參數(shù)

我們?cè)诠ぷ髦杏龅降那闆r:

  1. vue 3前端界面 + php 后端 API
  2. vue 3采用typescript
  3. API數(shù)據(jù)采用json格式

出現(xiàn)的問題

當(dāng)post api時(shí)提交的json數(shù)據(jù)中包含{}這種空J(rèn)SON對(duì)象,比如style:{}, 后端php在處理過程中會(huì)變成[]并返回給前端,導(dǎo)致前端后續(xù)的功能出現(xiàn)bug,如這時(shí)再往style中設(shè)置值就不能正常工作了:style[‘foo’] = ‘bar’, 這時(shí)設(shè)置是不成功

問題的原因

原因1: typescript的強(qiáng)類型,如果是javascript,這點(diǎn)其實(shí)并不影響,JS數(shù)組可以直接設(shè)置值:var style = []; style[“foo”] = “bar”;這個(gè)操作是成功的。
原因2: 后端php在處理的過程中都是按數(shù)組格式處理:json_decode($data, true),無形中就把{}變成了php的空數(shù)組,然后返回給前端時(shí)json_encode就變成[]。

解決辦法

修改后端json_decode總是按對(duì)象格式處理

Mac 11.0以上版本不能編譯PHP的問題

在Mac 11.x版本編譯php會(huì)提示php.h不存在,phpize也看不出php版本內(nèi)容:

grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No: 

這是因?yàn)樾掳姹镜膍ac 不在支持php了,后續(xù)可能會(huì)移除php, 通過php -v 可以看出

但實(shí)際上還沒有完全移除PHP,可以查看/Library/Developer/CommandLineTools/SDKs目錄下你系統(tǒng)版本對(duì)應(yīng)的目錄中usr/include/php里面的內(nèi)容是否還存在,如果還存在說明php devl的頭文件還在哪里,只是usr/bin/phpize找不到他們。

通過phpize的輸出也不難看出,他是去usr/include/php里面找對(duì)應(yīng)的頭文件,那么我們建立軟鏈接到對(duì)應(yīng)的/Library/Developer/CommandLineTools/SDKs下面的php目錄即可。但由于/usr/include目錄是Read only的,不允許創(chuàng)建軟鏈接,解決辦法就是:

1. 把/usr/bin/phpize 和/usr/bin/php-config兩個(gè)文件復(fù)制到/usr/local/bin,并修改如下兩處內(nèi)容,加上local

php-config中extension_dir也重新指定一個(gè)目錄,并且把/etc/php.ini extension_dir中也同步調(diào)整:

2. 建立軟連接 ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/usr/include/php /usr/local/include/php

然后使用phpize時(shí)指定全路徑 /usr/local/bin/phpize

configure時(shí)指定我們修改后的php-config:/usr/local/bin/phpize ./configrue –with-php-config=/usr/local/bin/php-config

make, make install 最后把編譯的so文件會(huì)拷貝到指定的extension_dir目錄中


該問題解決后,可通過pear的方式來安裝其他pecl 擴(kuò)展了

1. 下載pear: https://pear.php.net/go-pear.phar
2. 安裝: php go-pear.phar,在出現(xiàn)的頁面中分別把1,4兩步設(shè)置為如下圖所示,這其實(shí)是讓pecl命令在bin目錄中
3. 然后就可以通過pecl按照擴(kuò)展了,比如pecl install zip,會(huì)下載源碼并編譯,同上面的phpize & configure & make & make install

Mysql incorrect string value

這是由于mysql字段的存儲(chǔ)字符集存儲(chǔ)不了,比如utf8中存儲(chǔ)不了一些表情符號(hào),比如微信上的昵稱:abc🍃,解決辦法就是存儲(chǔ)要修改對(duì)應(yīng)的編碼字符集,與數(shù)據(jù)庫的通訊鏈接也要修改對(duì)應(yīng)的編碼字符集

  1. 把對(duì)應(yīng)字段的字符集修改成utf8mb4
  2. 同時(shí)把代碼中數(shù)據(jù)庫鏈接驅(qū)動(dòng)中的字符集也修改成utf8mb4,比如用pdo需要設(shè)置 :SET NAMES utf8mb4

兩者少一個(gè)都不行

gitlab 備份、升級(jí)與遷移

備份

gitlab-rake gitlab:backup:create

如果是putty遠(yuǎn)程連接服務(wù)器執(zhí)行該命令,可能由于某些git庫太大導(dǎo)致putty遲遲沒有反應(yīng)而導(dǎo)致鏈接中斷,鏈接中斷后該命令也會(huì)終止執(zhí)行,所以可以通過nohup 來把命令脫離命令行執(zhí)行:

nohup gitlab-rake gitlab:backup:create 2>&1 &

通過在nohup.out 中可以查看輸出日志

備份成功后在/var/opt/gitlab/backups中會(huì)產(chǎn)生一個(gè)類似于1610804990_gitlab_backup.tar的文件,一定要確保backup完成在copy該文件,上面的nohup.out中最后幾行是下面情況時(shí),說明備份完成了:

done
Dumping uploads …
done
Creating backup archive: 1610804990_gitlab_backup.tar … done
Uploading backup archive to remote storage … skipped
Deleting tmp directories … rake aborted!
Don’t know how to build task ‘/var/opt/backlog.log’

(See full trace by running task with –trace)
done
Deleting old backups … skipping

恢復(fù)

gitlab-rake gitlab:backup:restore BACKUP=/var/opt/gitlab/backups/1610804990

注意backup中的文件名不是完整的1610804990_gitlab_backup.tar,而只是_gitlab_backup.tar的前面部分

遷移

可以用scp把備份文件上傳到目標(biāo)服務(wù)器,在目標(biāo)服務(wù)器上執(zhí)行:scp src_username@src_ip:/var/opt/gitlab/backups/1481529483_gitlab_backup.tar /var/opt/gitlab/backups

升級(jí)

gitlab升級(jí)不能一次性跨大版本升級(jí),比如不能6.x升級(jí)到13.x,只能在一個(gè)major版本升到最高級(jí)別后在升級(jí)到下一個(gè)major版本(版本號(hào)格式:major.minor),官方給出來的升級(jí)順序是:

https://docs.gitlab.com/ee/update/#upgrade-paths

但我從7.6.x 升級(jí)到13.7并沒有完全按照這個(gè)順序,基本規(guī)則是升級(jí)到當(dāng)前major版本的最后一個(gè)版本后,再升級(jí)到下一個(gè)major的第一個(gè)版本,一次類推直到最新版本

每個(gè)版本的鏡像可以從這里下載:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

每次升級(jí)前,先stop服務(wù)

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop nginx
數(shù)據(jù)庫不要stop,在安裝時(shí)是需要備份數(shù)據(jù)庫的,所以不能停

wget 下載好對(duì)應(yīng)的rpm包后執(zhí)行 rpm -Uvh 安裝包

安裝包會(huì)備份數(shù)據(jù)庫部分,安裝新版本,刪除舊版本,升級(jí)成功收gitlab-ctl restart即可