Zend Framework 2 建立自己的 Module (5)

本篇文章是要來介紹有關於文字翻譯,還有頁面的樣式

Styling and Translations

有關於頁面上的文字內容都可以進行對應的翻譯,可以到:/path/to/project-name/module/Application/language 查看 en_US.po 檔案

po 副檔名檔案是一種翻譯類型的檔案,因此需要特殊的 editor 才能夠打開,我們這邊要先去下載一個 poedit 這個編輯氣是屬於跨平台的,進入官網之後是很容易找到下載點的。

下載回來之後,安裝並打開,會看到介面如下面的截圖:

poedit

我們按下開啟打開 en_US.po 檔,就可以進行編輯的動作,按照下面的圖把 skeleton application “翻譯" 成 “tutorial"

poedit

接著存檔之後,檔案選單中有一個編譯成 MO 檔,改完之後都需要編譯成新的 MO 檔

接下來是 styling 的部分,就是樣式的地方,每次在頁面出來的時候,都會有:© 2005 – 2016 by Zend Technologies Ltd. All rights reserved. 這個 copyright 的文字。

為了要把它移掉,我們需要去編輯:/path/to/project-name/module/Application/view/layout/layout.phtml

並移除:<p>&copy; 2005 – <?php echo date(‘Y’) ?> by Zend Technologies Ltd. <?php echo $this->translate(‘All rights reserved.’) ?></p> 這一行。
接著再打開頁面之後,那一行 copyright 文字就會不見了。

album

Zend Framework 2 建立自己的 Module (4)

Database and models

在這裡,我們使用了:Zend\Db\TableGateway\TableGateway 做為對資料庫中的資料表進行新增,查詢,修改以及刪除。

我們使用 MySQL 並透過 PHP 的 PDO 層作為存取資料庫,我們先建立一個名為:zf2tutorial 的資料庫作為資料庫的名稱,接著執行下面的 SQL 檔的指令

The model files

Zend Framework 並沒有提供 Model 之類的 component 原因是因為這部分是我們自己的商業邏輯,我們需要自己寫的

我們建立一個名為 Album.php 並放在 /path/to/project-name/module/Album/src/Album/Model 目錄下

Album.php

在 Album.php 中,就只有一個簡單的 Album class 我們為了要與 Zend\Db 中的 TableGateway 運作正常,因此我們需要實做 exchangeArray() 方法,這個方法可以簡易的從另一個項目設定中去複製一個陣列中的資料,並把資料可以印出在 view 上 (或表單)

我們建立了一個 AlbumTable.php 檔在: /path/to/project-name/module/Album/src/Album/Model 目錄下

AlbumTable.php

其中裡面的方法功能介紹如下:fetchAll 就是得到一個查詢所有 Album 的集合,getAlbum 則是得到某一行的且傳回物件,saveAlbum 則是儲存一行 Album 相關的資料,最後的 deleteAlbum 則是刪除某一行指定的 Album 記錄。

Using ServiceManager to configure the table gateway and inject into the AlbumTable

修改前面的 Module.php,位置在:/path/to/project-name/module/Album/Module.php

接下來要加入有關資料庫登入的驗證資訊,所以我們要分別編輯:/path/to/project-name/config/autoload/global.php 與 /path/to/project-name/config/autoload/local.php

global.php

就是加入 db 資料庫相關的,像這裡就是定義 PDO 的,下面則是加入 servive_manager 與 Zend\Db\Adapter\Adapter 內建操作資料庫有關的。

local.php

則是填入登入 MySQL 的驗證資訊,如帳號與密碼。

 

Back to the controller

Listing albums

 

AlbumController.php 前面已經有使用過了,在這裡可以看到一些註解,可以知道加了哪幾行。

index.phtml

下面是有關於視圖 (view) index.phtml 的 code

由 index.phtml 得知:

We always use the escapeHtml() view helper to help protect ourselves from Cross Site Scripting (XSS) vulnerabilities (see http://en.wikipedia.org/wiki/Cross-site_scripting).

我們常會使用 escapeHtml() 來防止跨站腳本的漏洞。

 

最後,輸入網址:http://localhost/project-name/public/album 就會看到如下的畫面

user-guide.database-and-models.album-list

 

到這裡就完成了一個簡單的表格列出專輯清單,下一篇我們會介紹:Styling and Translations 樣式與翻譯。

Zend Framework 2 建立自己的 Module (3)

繼 前一篇文章  我們初步建立了 Module 與設定,接下來要介紹 Routing 與 Controllers

Routing and controllers

依照官方的文件,我們列出下列的表格,分別去描述 Page 名稱與敘述頁面 (Page) 所要做什麼事情

(Page)頁面名稱 (Description)描述
Home edit與delete做為可以編輯與刪除的動作
Add new album (form)做為一個新增專輯
Edit album (form)可以編輯專輯
Delete album (delete)專輯

從上面得知,我們有四個頁面,那每個頁面有相對應的動作,我們把每個動作寫在同一個 Controller (控制器)中,在 Controller 類別中,建立四個方法分別去對應上面表格中的四個動作。

Page Controller Action
Home AlbumController index
Add new album AlbumController add
Edit album AlbumController edit
Delete album AlbumController delete

編輯 /path/to/project-name/module/Album/config/module.config.php

從 code 得知,我們加入了一個 Controller 名字叫做:AlbumController 與一段 code 做為:router 路由網址,而下列的表格為路由網址:

URL Page Action
/album Home (list of albums) index
/album/add Add new album add
/album/edit/2 Edit album with an id of 2 edit
/album/delete/4 Delete album with an id of 4 delete

Create the controller

一般來說 Controller 的命名為:{Controller name}Controller

/path/to/project-name/module/Album/src/Album/Controller

網址對應的動作為:

URL Method called
http://zf2-tutorial.localhost/album Album\Controller\AlbumController::indexAction
http://zf2-tutorial.localhost/album/add Album\Controller\AlbumController::addAction
http://zf2-tutorial.localhost/album/edit Album\Controller\AlbumController::editAction
http://zf2-tutorial.localhost/album/delete Album\Controller\AlbumController::deleteAction

Initialise the view scripts 初始化視圖(樣版)腳本

  • /path/to/project-name/module/Album/view/album/album/index.phtml
  • /path/to/project-name/module/Album/view/album/album/add.phtml
  • /path/to/project-name/module/Album/view/album/album/edit.phtml
  • /path/to/project-name/module/Album/view/album/album/delete.phtml

修改 /path/to/project-name/module/Album/config/module.config.php

下一篇則會介紹:建置資料庫與模型 (Model) 的關係

Zend Framework 2 建立自己的 Module (2)

前置作業

先參考前一篇,把 skeleton (骨架) application 的建立

我們遵照線上文件,把 Module 建立起來,我們建立一個 Module 名稱為 Album 其目錄架構如下:

 

project-name/

—–/module

 ———-/Album

—————/config

—————/src

——————–/Album

————————-/Controller

————————/Form

————————/Model

—————/view

——————–/album

————————/album

由上面的目錄架構得知,最上層的專案根目錄為:project-name 而 module 是下一層目錄,接下來是 Album 我們取的目錄名稱,再下一層有 config, src 以及 view 這三個目錄。

而 src 目錄下又有 Album 目錄,Album 目錄下又有 Controller, From 以及 Model,而 view 目錄下面有一層 album 再下一層有 album。

 

Module.php

建立一個 PHP 檔名為 Module.php  把它放在:/path/to/project-name/module/Album/Module.php 程式碼如下:

 

Autoloading files

自動載入用,因為我們在開發的階段,因此只要建立一個 PHP  檔,其路徑:/path/to/project-name/module/Album/autoload_classmap.php 程式碼如下:


<?php return array(); ?>

 

Module Configuration

建立一個 module.config.php 並放在:/path/to/project-name/module/Album/config 程式碼如下:

 

Informing the application about our new module

修改 application.config.php 其位置在:/path/to/project-name/config/application.config.php 加入一行 ‘Album’ 做為啟用 Album 模組
下一篇介紹:Routing and controllers

Zend Framework 2 建立 skeleton application (1)

Zend Framework 2 wiki 介紹

簡單說,這個框架是一個以 MVC 為基礎的框架,MVC 在這篇已經超出範圍,所以不在這裡去贅述,有興趣可以去找找資料

線上文件連結:http://zf2.readthedocs.io/en/latest/index.html

使用 Composer 下載 Zend Framework


#下載 Composer

curl -sS https://getcomposer.org/installer | /path/to/executable/php

#執行 composer.phar 產生一個 Zend Framework 的 skeleton application 專案

#參考文章: http://zf2.readthedocs.io/en/latest/user-guide/skeleton-application.html

php composer.phar create-project --stability="dev" zendframework/skeleton-application path/to/install

從上面可以得知,下載完之後的專案為一個正在開發的 skeleton 骨架 application

在這篇的文章中,會請你去設定 Apache 的 VirtualHost 去更改網址,如不要的話,或是有一些共享主機 (shared hosting) 並不允許你去更改 httpd.conf 的設定,所以這在部署上顯得較為困難,因此,如不改的話,其實可以連上 http://your-domain.com/project-name/public 就會看到下面有著與文件上一模一樣的截圖,有出現一模一樣的截圖就代表設定成功了。

user-guide.skeleton-application.hello-world

 

可以試著測試預設的 route 有沒有正常的運作試著輸入網址:http://your-domain.com/project-name/public/123 就會出現下面的 404 Not found

404

 

Error reporting

可以編輯 public 目錄下的 index.php 裡面的第四行插入下面這段 code:

其目的是在開發的階段可以立即的在網頁上顯示錯誤,不過記得網站上線之後要將錯誤關閉


<?php
/**
* Display all errors when APPLICATION_ENV is development. (這段是插入的)
*/
if ($_SERVER['APPLICATION_ENV'] == 'development') {
error_reporting(E_ALL);
ini_set("display_errors", 1);
}
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/

chdir(dirname(__DIR__));

// Decline static file requests back to the PHP built-in webserver
if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
return false;
}

// Setup autoloading
require 'init_autoloader.php';

// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();

下一篇介紹如何建立一個自己的 Module

Git 實用技巧

在這篇文章,記錄一些使用 Git 的技巧。

回復上一個 commit (不知道 commit-id 可以使用 git log 查詢)


git reset commit-id --hard

將遠端的 commit 強制更新到指定回復的 commit 時間點


git push repo-url branch-name --force

刪除一個標籤


git tag -d tag-name

刪除遠端上的標籤


git push repo-url branch-name :reds/tags/tag-name

加入一個標籤


git tag tag-name

將一個標籤推送到遠端


git push repo-url tag tag-name

查看所有標籤


git tag

 

以上,想到再補充。

設定 CentOS 上的 MariaDB

前言

由於要使用爬蟲的關係,跟朋友借了一個 server 來存放資料使用 XD,雖然 PHP , Apache 與 MariaDB(MySQL) 已經幫我完整的安裝好了。不過需要自己設定以下則是設定的方法 :

  1. 查看 MariaDB 服務是否有啟動。
    service mariadb status
    

    沒有則自行啟動

    service mariadb restart
    
  2. 啟動完成後,登入 MariaDB ,使用者為:root 密碼為空。
    # 登入 MariaDB
    mysql -u root -p
    # 登入之後,輸入下面的 SQL 語法
    UPDATE mysql.user SET Password=PASSWORD('your-newpassword') where USER='root';
    FLUSH PRIVILEGES;
    quit
    
  3. 完成之後,重新啟動 MariaDB 服務
    service mariadb restart
    
  4. 執行 mysql_secure_installation 去做 MySQL 的安全性設定
    mysql_secure_installation
    
  5. 最後再重新啟動 MariaDB 服務

以上就是 MariaDB 的設定方法。

 

Cross compile Python for Android

前置作業 & 注意事項

  1. 產生要移植平台相對應的 standalone toolchain ,參考 Android API level (系統版本) 傳送門
  2. cross compile relative libs. link
  3. 修正 cross compile 與 auto conf 期間產生的錯誤
  4. 注意編譯需將 libs 都編譯成 static mode. (non-dynamic mode) 目的是可以方便使用,缺點是檔案大小會較大,不過動態連結,缺點是在入時會呼叫外部的 *.so 檔,Linux 底下的動態連函式庫(Dynamic link library)。(DLL) 但是手機的路徑與 Linux 預設路徑是不同的,所以使用 static mode 不外部呼叫 DLL 是最保險,不然還要去處理載入外部的路徑問題。
  5. 下載 Python source code,也可以使用 MEGA 載點的,已經修正錯誤。
  6. 如果使用自行下載的 source 編譯與 auto conf 發生錯誤,可以自行參考MEGA 載點中的 source 裡的檔案,看是如何修改的。

Python-2.7.1

  1. MEGA 載點或 Python 官網下載 source code
  2. 若從MEGA上下載,可以跳過這一點。這一點是上 patch ,MEGA 載點裡有這個檔案可以使用:python-2.7.1-cross-compile.patch
  3. 編譯 host 版本的 Python
  4. 把產生執行檔改成:
    mv python hostpython
    mv Parser/pgen Parser/hostpgen
  5. 按照下面的 android-configure bash script file

#上 patch,第 2 點

patch -p1 < /path/to/python-2.7.1-cross-compile.patch


#android-configure

#!/bin/bash

export TOOLCHAIN=/home/lab501/android-toolchain-16
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
export ARCH="arm-linux-androideabi"
#export LD_LIBRARY_PATH="/data/local/tmp/_install_python/lib"
#change your shared libs'(libpython.so) path (LDFLAGS= --rpath)

./configure \
     LDFLAGS="-static -static-libgcc -fPIE -pie" \
    CFLAGS="-static -fPIE -pie" \
    --host=arm-linux-androideabi \
    --target=arm-linux-androideabi \
    --disable-shared \
    --prefix="/home/lab501/android-cross-compile-16/Python-2.7.1/_install"

make \
    HOSTPYTHON=/home/lab501/Python-2.7.1/hostpython \
    HOSTPGEN=/home/lab501/Python-2.7.1/Parser/hostpgen \
    CROSS_COMPILE=androideabi \
    CROSS_COMPILE_TARGET=yes \
    BLDSHARED="arm-linux-androideabi-gcc -shared" \

#make install...
#make -i install \
    #HOSTPYTHON=/home/lab501/Python-2.7.1/hostpython \
    #BLDSHARED="arm-linux-androideabi-gcc -shared" \
    #CROSS_COMPILE=androideabi \
    #CROSS_COMPILE_TARGET=yes

修改:setup.py 檔,設定如何 build modules

#for example, build hashlib modules
#只加入下面這兩行
#find_library_file(self.compiler, 'Modules',lib_dirs,
#       ['/home/lab501/Python-2.7.1/Modules'] )

if have_any_openssl:
#if have_usable_openssl:
# The _hashlib module wraps optimized implementations
# of hash functions from the OpenSSL library.
#comment this code. In order to cross compile hashlib.
#exts.append( Extension('_hashlib', ['_hashopenssl.c'],
# include_dirs = ssl_incs,
# library_dirs = ssl_libs,
# libraries = ['ssl', 'crypto']) )

#add this code. In order to cross compile hashlib. Important
find_library_file(self.compiler, 'Modules',lib_dirs,
['/home/lab501/Python-2.7.1/Modules'] )
#else:
# print ("warning: openssl 0x%08x is too old for _hashlib" %
# openssl_ver)
# missing.append('_hashlib')
#if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
# The _sha module implements the SHA1 hash algorithm.
#comment this code. In order to cross compile hashlib.
#exts.append( Extension('_hashlib', ['shamodule.c']) )
# The _md5 module implements the RSA Data Security, Inc. MD5

參考資料

How-to-Cross-Compile-Python-and-Run-in-Embedded-System

howto-cross-compile-python-25

後記

build modules :要自己去調整 setup.py 要試試看,有可能會調整失敗,try and error.

 

Cross compile MySQL for Android

前置作業 & 注意事項

  1. 產生要移植平台相對應的 standalone toolchain ,參考 Android API level (系統版本) 傳送門
  2. cross compile relative libs. link
  3. 修正 cross compile 與 auto conf 期間產生的錯誤
  4. 注意編譯需將 libs 都編譯成 static mode. (non-dynamic mode) 目的是可以方便使用,缺點是檔案大小會較大,不過動態連結,缺點是在入時會呼叫外部的 *.so 檔,Linux 底下的動態連函式庫。(DLL) 但是手機的路徑與 Linux 預設路徑是不同的,所以使用 static mode 不外部呼叫 DLL 是最保險,不然還要去處理載入外部的路徑問題。
  5. 下載 lighttpd 與  PHP source code,也可以使用 MEGA 載點的,已經修正錯誤。
  6. 如果使用自行下載的 source 編譯與 auto conf 發生錯誤,可以自行參考MEGA 載點中的 source 裡的檔案,看是如何修改的。
  7. MySQL source 下載點:http://downloads.mysql.com/archives/community/

version:5.0.22

bash-script for auto conf.


#!/bin/bash

export TOOLCHAIN=/home/lab501/android-toolchain-16
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
export CFLAGS="-I$TOOLCHAIN/sysroot/usr/include -fPIE -pie"
export LDFLAGS="-static -L$TOOLCHAIN/sysroot/usr/lib -L$TOOLCHAIN/sysroot/usr/include -fPIE -pie"
export ac_cv_sys_restartable_syscalls="no"

./configure \
--host=arm-linux-androideabi \
--enable-static \
--enable-local-infile \
--with-named-curses-libs=/home/lab501/android-cross-compile-16/ncurses-5.9/_install/lib/libncurses.a \
--with-named-thread-libs=/home/lab501/android-toolchain-16/sysroot/usr/include/pthread.h \
--prefix=/home/lab501/android-cross-compile-16/mysql-5.0.22/_install \
--without-debug \
--without-docs \
--without-plugin-innodb_plugin \
--without-plugin-innobase \
--without-libedit \
--with-readline \
--with-mysqld-user=root \
--with-charset=utf8 \
--with-extra-charsets=big5,gbk,gb2312,utf8,ascii \
--without-man

#make and make install

 

[參考資料]

auto conf 與 make 時期遇到的錯誤:

mysql数据库在arm+linux平台上的移植

setpwent 未定義參考解決方式 (參考文章下方的評論)

undefined reference to `setpwent’

 

Cross compile Lighttpd and PHP for Android

前置作業 & 注意事項

  1. 產生要移植平台相對應的 standalone toolchain ,參考 Android API level (系統版本) 傳送門
  2. cross compile relative libs. link
  3. 修正 cross compile 與 auto conf 期間產生的錯誤
  4. 注意編譯需將 libs 都編譯成 static mode. (non-dynamic mode) 目的是可以方便使用,缺點是檔案大小會較大,不過動態連結,缺點是在入時會呼叫外部的 *.so 檔,Linux 底下的動態連函式庫。(DLL) 但是手機的路徑與 Linux 預設路徑是不同的,所以使用 static mode 不外部呼叫 DLL 是最保險,不然還要去處理載入外部的路徑問題。
  5. 下載 lighttpd 與  PHP source code,也可以使用 MEGA 載點的,已經修正錯誤。
  6. 如果使用自行下載的 source 編譯與 auto conf 發生錯誤,可以自行參考MEGA 載點中的 source 裡的檔案,看是如何修改的。

Lighttpd-1.4.33–a lighweight http server

完成前置作業後,開始使用下面的 android-configure 檔,做 auto conf 產生要編譯 Lighttpd 的 Makefile


#!/bin/bash

export TOOLCHAIN=/home/lab501/android-toolchain
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
export CROSS_COMPILING=yes
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LDFLAGS="-L/home/lab501/pcre-8.34/_install/lib -fPIE -pie"
export CFLAGS='-fPIE'

#manual copy pcre.h to /path/to/lighttpd-1.4.33/src/pcre.h

./configure \
 --prefix=/home/lab501/lighttpd-1.4.33/_install \
 --disable-shared \
 --enable-static \
 --with-openssl=/home/lab501/openssl-1.0.1f/_install \
 --with-pcre=/home/lab501/pcre-8.34/_install \
 --with-zlib=/home/lab501/zlib-1.2.8/_install \
 --without-bzip2 \
 --without-lua \
 --host=arm-linux-androideabi

#make and make install

PHP-5.6.17– a hypertext preprocessor


#!/bin/bash

export TOOLCHAIN=/home/lab501/android-toolchain
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export CFLAGS='-fPIE -pie'
export LDFLAGS='-fPIE -pie'

./configure \
 --prefix=/home/lab501/php-5.6.17/_install \
 --enable-static \
 --disable-shared \
 --disable-all \
 --enable-filter \
 --enable-calendar \
 --enable-ctype \
 --enable-dom \
 --enable-exif \
 --enable-fileinfo \
 --enable-ftp \
 --with-mhash="/home/lab501/mhash-0.9.9.9/_install" \
 --disable-intl \
 --disable-phar \
 --enable-posix \
 --enable-shmop \
 --enable-simplexml \
 --disable-sysvmsg \
 --enable-sysvsem \
 --disable-sysvshm \
 --enable-tokenizer \
 --disable-wddx \
 --enable-xmlreader \
 --enable-xmlwriter \
 --enable-pcntl \
 --enable-soap \
 --enable-cgi \
 --enable-json \
 --with-zlib \
 --enable-zip \
 --with-mysql=mysqlnd \
 --enable-mysqlnd \
 --with-mysqli=mysqlnd \
 --enable-pdo \
 --with-pdo-mysql=mysqlnd \
 --enable-libxml \
 --with-pdo-sqlite \
 --with-sqlite3 \
 --enable-sockets \
 --enable-bcmath \
 --enable-mbstring \
 --enable-mbregex \
 --enable-session \
 --disable-ipv6 \
 --enable-opcache=no \
 --disable-cli \
 --without-pear \
 --enable-fpm \
 --enable-hash \
 --with-bz2="/home/lab501/bzip2-1.0.6/_install" \
 --with-zlib-dir="/home/lab501/zlib-1.2.8/_install" \
 --with-libxml-dir="/home/lab501/libxml2-2.7.6/_install" \
 --with-curl="/home/lab501/curl-7.35.0/_install" \
 --with-openssl="/home/lab501/openssl-1.0.1f/_install" \
 --with-jpeg-dir="/home/lab501/jpeg-9/_install" \
 --with-png-dir="/home/lab501/libpng-1.6.9/_install" \
 --with-freetype-dir="/home/lab501/freetype-2.5.3/_install" \
 --with-iconv-dir="/home/lab501/libiconv-1.14/_install" \
 --with-mcrypt="/home/lab501/libmcrypt-2.5.8/_install" \
 --with-pcre-dir="/home/lab501/pcre-8.34/_install" \
 --host=arm-linux-androideabi

#make and make install

[參考文章]

編輯 android-configure bash script file 參考:

Cross Compile lighttpd & PHP for ARM based embdedded device

編譯時遇到錯誤解決方法參考:

(OK)port_php-5.6.14_to_Android-(和lighttpd的集成成功) -沒有基於Android 4.4系統的源碼

[ 額外 PHP 的錯誤 ]

因為有一些 source 裡面,Android toolchain 本身並沒有定義,所以導致會出現 XXX undelclared . 類似錯誤如下:


/home/lab501/android-cross-compile-16/php-5.6.17/ext/mysql/php_mysql.c: In function 'php_mysql_do_connect':
/home/lab501/android-cross-compile-16/php-5.6.17/ext/mysql/php_mysql.c:757:39: error: 'ushort' undeclared (first use in this function)
MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port);

解決方法:

修改 /path/to/android-toolchain-standalone/sysroot/usr/include/sys 底下的 types.h

最下面新增:

/* Old compatibility names for C types. */
typedef unsigned short int ushort;

這兩行

錯誤:’S_IREAD’ undeclared

因為缺少 S_IREAD 與 S_WRITE 定義,因此在路徑:/home/lab501/android-toolchain-16/sysroot/usr/include/linux/stat.h 這個的 header 檔加入:

 
#define S_IRWXU 00700 
#define S_IRUSR 00400 
#define S_IREAD 00400 
#define S_IWUSR 00200 
#define S_IWRITE 00200 
#define S_IXUSR 00100 
#define S_IEXEC 00100 
#define S_IRWXG 00070 
#define S_IRGRP 00040
#define S_IWGRP 00020 
#define S_IXGRP 00010 
#define S_IRWXO 00007 
#define S_IROTH 00004 
#define S_IWOTH 00002 
#define S_IXOTH 00001 

因為還有一些錯誤,經修正過了,所以 將 MEGA 載點中的 android-toolchain-9.tar.bz2 裡的 android-toolchain下的 sysroot 整個目錄 對應 /path/to/your-android-toolchain/sysroot 做覆蓋,修正其他已經修改過的錯誤。

若是只想更動修改的檔案,善用 grep 指令,把有修正過的檔案做 copy 即可。例如:


grep you-find-key-words *.h

[ 後記 ]

  1. 網路上很多文章也是沒有提到錯誤如何修正,就只有參數如何編寫得比較多,遇到錯誤還是需要上網找解法。
  2. 這篇文章最主要是補上了 MEGA 下載點可以供其他人在編譯 source code 時遇到錯誤可以參考。
  3. 我是依照網路上文章的版本做編譯的,並非使用最新的版本,如果要使用最新的版本做編譯,則可以到每個官網去做下載。