今天來在LAMP環境下搭建一個PHP項目,開始以前,先來普及下物聯網常識:php
物聯網,即Internet of Things,簡寫IOT。讓全部能行使獨立功能的普通物體實現互聯互通的網絡,經過物聯網能夠用中心計算機對機器、設備、人員進行集中管理、控制,實現物物相連。近幾年物聯網在運輸、物流、健康醫療、智能環境(家庭、辦公、工廠)等領域都在迅速發展,前景打好。
B哥最近研究一個物聯網項目:基本功能就是要在web網站和手機app端實時監控硬件上發來的數據,用於分析、集中管理與控制,硬件是基於ARM的,web端是用php開發的,基本功能能夠跑起來,如今主要在這基礎上實現本身的功能。上一節B哥已經在雲服務器上搭建好LAMP環境(linux上安裝LAMP筆記),接下來就要把web項目部署好服務器上。遇到了不少問題,在此一一記錄。html
其中項目代碼結構以下:前端
先把項目傳到服務器上,而後解壓:java
cd /var/www/html unzip AdminIOT #先把目錄下文件權限改成777 chmod -R 777 AdminIOT
用如下命令查看httpd、php、mariadb的版本:python
rpm -qa|grep -P "httpd|php|maria"
分別爲2.4.六、5.4.1六、5.5.56mysql
配置apache服務器的時候httpd-vhosts.conf文件在/usr/share/doc/httpd-2.4.6目錄下linux
(windows上好像直接在conf/extra/下),web
因而在/etc/httpd/conf/httpd.conf中加入:面試
include /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf,spring
結果啓動時報錯了。因而就把
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf文件複製到/etc/httpd/conf/extra目錄下:
#建立目錄 mkdir -p /etc/httpd/conf/extra #複製 cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf/extra
而後在extra下的httpd-vhosts.conf中添加以下配置:
<VirtualHost *:80> ServerName www.mysmallsoup.com DocumentRoot "/var/www/html/AdminIOT/public" DirectoryIndex index.php <Directory "/var/www/html/AdminIOT/public"> AllowOverride All Require all granted Options all </Directory> ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log" CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common </VirtualHost>
而後在http.conf配置文件中包含httpd-vhosts.conf文件:
cd /etc/httpd/conf vim httpd.conf #打開文件後在文件末尾加入如下配置: Include conf/extra/httpd-vhosts.conf
而後將域名綁定IP:
vim /etc/hosts
加入IP 域名,以下:
120.79.147.88 www.mysmallsoup.com
而後從新啓動httpd服務器:
systemctl restart httpd
注:若是直接在windows上用域名訪問,得在windows的host里加IP 域名對應關係,可是加了之後訪問會報以下錯,由於域名得先備案才能用。因此下面都用IP訪問。
而後在本地windows瀏覽器裏訪問http://120.79.147.88:80地址,報錯:
date(): It is not safe to rely on the system's timezone settings:
而後在查到:
實際上,從 PHP 5.1.0 ,當對使用date()等函數時,若是timezone設置不正確,在每一次調用時間函數時,都會產生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0中,date.timezone這個選項,默認狀況下是關閉的,不管用什麼php命令都是格林威治標準時間,可是PHP5.3中好像若是沒有設置也會強行拋出了這個錯誤的,解決此問題,只要本地化一下,就好了。
而咱們使用的是PHP5.4版本,而後在php.ini文件中加入時區的配置:
vim /etc/php.ini#加入以下配置:date.timezone = "Asia/Shanghai"
加入之後,保存退出,從新啓動apache服務,刷新頁面,錯誤就解決了。
到這一步,說明項目部署流程已經打通,可是如今須要登陸,那麼確定要在數據庫裏面先存入用戶名密碼等一些數據。接下來,先給數據庫裏導入些初始化數據。
數據庫導入數據:
先從新啓動數據庫:
systemctl restart mariadb
而後試着在本地windows上用Navicat數據庫管理工具導入sql腳本,用於數據庫的初始化(建庫、數據插入等),我習慣性的把端口寫爲3306(數據庫默認端口),而後去鏈接,發現報錯了:
而後去查看3306端口是否監聽:
netstat -anp | grep 3306
查不到東西,說明3306端口沒有監聽,這就奇怪了。而後登錄數據庫:
mysql -uroot -p數據庫密碼
登錄進去查看數據庫端口:
show variables like 'port';
發現查到的端口居然是0,而後又查了資料,發現是啓動數據庫的時候加了skip-networking致使的,啓動時用了以下命令:
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
--skip-networking=0表示監聽配置端口,默認監聽3306,等於1或者--skip-networking不賦值表示跳過端口監聽,此時監聽0,網絡不可訪問數據庫,只能數據庫節點訪問。能夠經過如下命令查看:
show variables like 'skip_networking';
發現是ON,說明開啓了skip_networking,接下來咱們要關掉它。
查看mysql進程:
ps -ef | grep mysql
[圖片上傳中...(image-3ac06c-1571321042895-17)]
而後殺掉進程,從新啓動數據庫:
kill 12080 mysqld_safe --user=mysql --skip-grant-tables --skip-networking=0 &
而後再來查看3306端口是否監聽:
netstat -anp | grep 3306
發現端口正常監聽,而後登錄數據庫,查看:
發現port爲3306,skip_networking爲OFF,此時再在windows上鍊接數據庫,就ok了。
鏈接上數據庫後,就能夠導入sql文件了:
導入之後,打開剛纔的web登錄頁面,輸入用戶名和密碼,發現驗證碼圖片看不見:
而後去看運行日誌:
cd /var/www/html/AdminIOT/runtime/log/201806 tailf 10.log
而後刷新驗證碼,報錯Call to undefined function Thinkimagecreate()
而後查看以下的說法:
在php中imagecreate函數是一個圖形處理函數,主要用於新建一個基於調色板的圖像了,而後在這個基礎上咱們能夠建立一些圖形數字字符之類的,但這個函數須要GD庫支持,若是沒有開啓GD庫使用時會提示Call to undefined function imagecreate()錯誤。
那就試着安裝一下GD庫吧,執行yum安裝gd命令,而後從新啓動apachce服務以使安裝後的GD庫生效。
yum -y install php-gd systemctl restart httpd
而後刷新頁面,驗證碼就能夠正常顯示了。登錄進去之後,又報錯了:Call to undefined function thinkmb_strlen()。
網上有人說,遇到上述錯誤,是未開啓php_mbstring拓展,即找到php.ini裏的
;extension=php_mbstring.dll把前面的;去掉,可是找了發現沒有這個擴展配置,多是由於版本較高的緣由。在/etc/php.d目錄下也沒找到此擴展,而後就用yum安裝一個吧,而後重啓apache服務:
yum install -y php-mbstring systemctl restart httpd
重啓之後登陸頁面後這個錯誤就沒了,可是又報另外一個錯誤:
could not find driver
而後安裝php-mysql,安裝好後,重啓apache服務:
yum install php-mysql.x86_64 systemctl restart httpd
從新登陸頁面,這個錯誤也過去了。又報另外一個錯誤:
SQLSTATE[28000] [1045] Access denied for user 'iotadmin'@'localhost' (using password: YES)。
而後登錄數據庫,受權iotadmin用戶訪問權限:
grant all privileges on adminiot.* to 'iotadmin'@'localhost' identified by 'iotadmin'; flush privileges;
執行完之後,再次刷新頁面,報錯就過去了。接下來的又是另外一個錯,錯誤以下圖:
進後臺去看運行日誌10.log,報錯以下:
cd /var/www/html/AdminIOT/runtime/log/201806/ tailf 10.log
找到代碼Base.php的198行,以下:
代碼報錯:Arbitrary expressions in empty are allowed in PHP 5.5 only less,
大概意思就是說「不一樣類型的表達式用empty判空只有PHP5.5才」,而服務器上安裝的是PHP5.4版本,因此就報這個錯。這裏不妨換一種方式寫,只要邏輯是同樣的。那就改爲了這樣,原來的寫法先註釋掉。
而後把文件替換到服務器對應路徑下,重啓apache服務,刷新頁面,一切OK。
到這裏web項目就正常跑起來了。一路走下來,步步是坑啊,作一下筆記,記錄一下坑,之後確定會用到的。
本公衆號免費提供csdn下載服務,海量IT學習資源,若是你準備入IT坑,勵志成爲優秀的程序猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時咱們組建了一個技術交流羣,裏面有不少大佬,會不定時分享技術文章,若是你想來一塊兒學習提升,能夠公衆號後臺回覆【2】,免費邀請加技術交流羣互相學習提升,會不按期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你