busybox filesystem httpd php-5.5.31 sqlite3 webserver

/********************************************************************
 *      busybox filesystem httpd php-5.5.31 sqlite3 webserver
 * 聲明:
 *     本文主要是記錄使用httpd、php五、sqlite3搭建php web服務器。
 *
 *                                 2016-1-24 深圳 南山平山村 曾劍鋒
 *******************************************************************/

1、參考文章:
    1. Run busybox httpd with php
        https://box.matto.nl/busyboxphp.html
    2. Sqlite undefined reference to `sqlite3_open' error in Netbeans C++ on Ubuntu, Integrating SQLite into Netbeans C++ Ubuntu
        http://stackoverflow.com/questions/3463438/sqlite-undefined-reference-to-sqlite3-open-error-in-netbeans-c-on-ubuntu-in
    3. 嵌入式WEB服務器移植三部曲之PHP的移植
        http://blog.csdn.net/cos_sin_tan/article/details/7734278
    4. Real210 編譯sqlite錯誤:.//libsqlite3.a(sqlite3.o): In function `unixDlSym’:
        http://www.jyguagua.com/?p=965
    5. 成功移植SQLite3到ARM Linux開發板
        http://www.myir-tech.com/bbs/thread-6189-1-1.html
    6. ARM上linux終端操做SQLITE,退格鍵問題
        http://www.programgo.com/article/61872541163/
    7. 用busybox作一個簡單的文件系統 
        http://blog.chinaunix.net/uid-9688646-id-3346880.html
    8. Using SQLite3 with PHP
        http://babbage.cs.qc.cuny.edu/courses/cs903/2013_02/using_sqlite3.html

2、測試busybox httpd:
    1. cat /www/index.html
        <h1>Welcome to Tinyfs</h1>
        <p>zengjf</p>   
    2. shell命令:/usr/sbin/httpd -vv -f -h /www/
    3. 查看ARM板IP:
        [zengjf@root www]# ifconfig eth0
        eth0      Link encap:Ethernet  HWaddr 1E:ED:19:27:1A:B3  
                  inet addr:10.0.1.52  Bcast:10.0.1.255  Mask:255.255.255.0
                  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                  RX packets:39 errors:0 dropped:0 overruns:0 frame:0
                  TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
                  collisions:0 txqueuelen:1000 
                  RX bytes:4990 (4.8 KiB)  TX bytes:4050 (3.9 KiB)

        [zengjf@root www]# 
    4. PC機瀏覽器訪問:http://10.0.1.52/
        經驗證獲取到了正確信息,Vim裏貼不上圖,就不貼圖了。
    5. shell響應以下:
        [zengjf@root www]# /usr/sbin/httpd -vv -f -h /www/
        10.0.1.50:55185: url:/
        10.0.1.50:55185: response:200
3、編譯、安裝、測試php-5.5.31
    1. ./configure -host=arm-linux-gnueabihf -prefix=/usr/local/php -disable-all -enable-pdo -with-sqlite3 -with-sqlite -with-pdo-sqlite -with-zlib -without-iconv
    2. make
        1. 錯誤
            ext/sqlite3/libsqlite/sqlite3.o: In function `unixDlError':
            /home/Qt/rootfs/busybox/php/php-5.5.31/ext/sqlite3/libsqlite/sqlite3.c:31521: undefined reference to `dlerror'
            ext/sqlite3/libsqlite/sqlite3.o: In function `unixDlClose':
            /home/Qt/rootfs/busybox/php/php-5.5.31/ext/sqlite3/libsqlite/sqlite3.c:31552: undefined reference to `dlclose'
            ext/sqlite3/libsqlite/sqlite3.o: In function `unixDlSym':
            /home/Qt/rootfs/busybox/php/php-5.5.31/ext/sqlite3/libsqlite/sqlite3.c:31548: undefined reference to `dlsym'
            ext/sqlite3/libsqlite/sqlite3.o: In function `unixDlOpen':
            /home/Qt/rootfs/busybox/php/php-5.5.31/ext/sqlite3/libsqlite/sqlite3.c:31507: undefined reference to `dlopen'
            collect2: error: ld returned 1 exit status
            make: *** [sapi/cli/php] Error 1
        2. 解決方法:
            修改Makefile中的:
                EXTRA_LIBS = -lcrypt -lcrypt -lrt -lz -lm -lcrypt -lcrypt 
            爲:
                EXTRA_LIBS = -lcrypt -lcrypt -lrt -lz -lm -lcrypt -lcrypt -ldl
        3. 效果:
            end_closures.lo Zend/zend_float.lo Zend/zend_string.lo Zend/zend_signal.lo Zend/zend_generators.lo Zend/zend_objects.lo Zend/zend_object_handlers.lo Zend/zend_objects_API.lo Zend/zend_default_classes.lo Zend/zend_execute.lo main/internal_functions_cli.lo sapi/cgi/cgi_main.lo sapi/cgi/fastcgi.lo -lcrypt -lcrypt -lrt -lz -lm -lcrypt -lcrypt -ldl  -o sapi/cgi/php-cgi

            Build complete.
            Don't forget to run 'make test'.
    3. sudo make install
    4. 拷貝PC機/usr/local/php目錄下文件到:<filesystem root>/usr/local/php
    5. 配置httpd.conf:
        cat /etc/httpd.conf
            *.php:/usr/local/php/bin/php-cgi
    6. cat /www/test.php
        <?
            phpinfo();
        ?>
    7. PC機瀏覽器訪問:http://10.0.1.52/test.php
        1. 報錯現象:
        This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive.
        For more information as to why this behaviour exists, see the manual page for CGI security.
        For more information about changing this behaviour or re-enabling this webserver, consult the installation file that came with this distribution, or visit the manual page.
        2. 解決辦法:
            將force-cgi-redirect設置disable。
    8. 查看php.ini位置:
        [zengjf@root /usr/local/php/bin]# ./php-cgi -i | grep ini
        <tr><td class="e">Configuration File (php.ini) Path </td><td class="v">/usr/local/php/lib </td></tr>
        <tr><td class="e">Loaded Configuration File </td><td class="v">/usr/local/php/lib/php.ini </td></tr>
        <tr><td class="e">Scan this dir for additional .ini files </td><td class="v">(none) </td></tr>
        <tr><td class="e">Additional .ini files parsed </td><td class="v">(none) </td></tr>
        <tr><td class="e">user_ini.cache_ttl</td><td class="v">300</td><td class="v">300</td></tr>
        <tr><td class="e">user_ini.filename</td><td class="v">.user.ini</td><td class="v">.user.ini</td></tr>
        <tr><td class="e">Classes </td><td class="v">AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException </td></tr>
    9. 配置php.ini:
        cat /usr/local/php/lib/php.ini
            cgi.force_redirect = 0
            cgi.redirect_status_env ="yes";
    10. PC機瀏覽器訪問:http://10.0.1.52/test.php
        經驗證獲取到了正確信息,Vim裏貼不上圖,就不貼圖了。
    11. shell響應以下:
        [zengjf@root /usr/local/php/lib]# /usr/sbin/httpd -vv -f -h /www/
        10.0.1.50:58652: url:/
        10.0.1.50:58652: response:200
        10.0.1.50:58656: url:/test.php

4、編譯、安裝、測試sqlite3:
    1. ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/sqlite
    2. make
    3. sudo make install
        1. 報錯:
            libtool: install: /usr/bin/install -c .libs/libsqlite3.a /usr/local/sqlite/lib/libsqlite3.a
            libtool: install: chmod 644 /usr/local/sqlite/lib/libsqlite3.a
            libtool: install: arm-linux-gnueabihf-ranlib /usr/local/sqlite/lib/libsqlite3.a
            ./libtool: line 1720: arm-linux-gnueabihf-ranlib: command not found
            make[1]: *** [install-libLTLIBRARIES] Error 127
            make[1]: Leaving directory `/home/Qt/rootfs/busybox/sqlite/sqlite-autoconf-3100200'
            make: *** [install-am] Error 2
        2. 解決方法:
            是因爲使用了sudo,致使環境變丟失,用su切換到root用戶,再從新設置環境變量來解決。
    4. 拷貝/usr/local/sqlite中的文件到<filesystem root>下對應的目錄。
    5. 創建軟連接:ln -s /bin/sqlite3 /bin/sqlite
    6. 不能使用退格鍵(backspace):
        1. 錯誤現象:
            [zengjf@root ~]# sqlite
            SQLite version 3.10.2 2016-01-20 15:27:19
            Enter ".help" for usage hints.
            Connected to a transient in-memory database.
            Use ".open FILENAME" to reopen on a persistent database.
            sqlite> shw^H^H^H^H^H
        2. 解決方法:
            終端執行shell命令:stty erase ^H
    7. 在ARM板上運行效果以下:
        [zengjf@root ~]# sqlite
        SQLite version 3.10.2 2016-01-20 15:27:19
        Enter ".help" for usage hints.
        Connected to a transient in-memory database.
        Use ".open FILENAME" to reopen on a persistent database.
        sqlite> .show
                echo: off
                 eqp: off
          explain: off
             headers: off
                mode: list
           nullvalue: ""
              output: stdout
        colseparator: "|"
        rowseparator: "\n"
               stats: off
               width: 
        sqlite> .quit
        [zengjf@root ~]# 
    8. cat /www/teatdb.php
        <?
            $db = new SQLite3('my_database') or die('Unable to open database');
            $query = <<<EOD
              CREATE TABLE IF NOT EXISTS users (
                username STRING PRIMARY KEY,
                password STRING)
        EOD;    # 這裏必定要頂格
            $db->exec($query) or die('Create db failed');
            $query = <<<EOD
              INSERT INTO users VALUES ( 'zengjf', 'root' )
        EOD;    # 這裏必定要頂格
            $db->exec($query) or die("Unable to add user $user");
            $result = $db->query('SELECT * FROM users') or die('Query failed');
            while ($row = $result->fetchArray())
            {
              echo "User: {$row['username']}\nPasswd: {$row['password']}\n";
            }
        ?>
    9. PC機瀏覽器訪問:http://10.0.1.52/testdb.php
        經驗證獲取到了正確信息,Vim裏貼不上圖,就不貼圖了。
    10. shell響應以下:
        [zengjf@root ~]# 
        127.0.0.1:54905: url:/
        127.0.0.1:54905: response:200
        10.0.1.50:51536: url:/testdb.php
    11. 可能錯誤:
        1. Fatal error: Class 'SQLiteDatabase' not found in /www/testdb.php on line 3
        2. 這是因爲移植的sqlite3,可能這裏使用的是sqlite的接口,
           使用sqlite3的接口能夠避免這個錯誤。

 

相關文章
相關標籤/搜索