Rumah php教程 php手册 用PHP扩展做一个HelloWorld!

用PHP扩展做一个HelloWorld!

Jul 11, 2016 pm 08:00 PM
sambungan php kod Sumber terbuka pengaturcaraan bahasa pengaturcaraan pembangunan perisian

PHP 尽管提供了大量有用的函数,但是在特殊情况下还可能需要进行扩展编程,比如大量的 PECL(PHP Extension Community Library)就是以扩展的形式提供的(动态链接库dll文件),它们比 PEAR 的运行效率要高很多。
    PHP 扩展是用 C 或 C++ 编写的,需要编译成动态连接库 dll 文件后在 PHP 环境下注册后才能使用。
    编写 PHP 扩展的软件要求:
      VC++6.0 或 VC++.NET 环境。
      PHP 的源代码,需要编译。
    如果不愿意编译 PHP 的源代码,可以再下载 PHP 的已经编译成功的二进制代码(就是我们部署 PHP 运行环境的那些文件包)。注意分别下载的源文件包和已编译包,它们的版本必须一致。

    过程:

    1,安装 VC++6.0,并选择把其可执行文件路径加入环境变量中,使在命令行环境任意路径下可以运行编译器。
    2,安装 PHP 运行环境,并与 IIS 正确集成在一起。假设使用的 PHP 版本为 5.2.5,下载 php-5.2.5-Win32.zip 二进制包和 php-5.2.5.tar.gz 源代码包。安装环境为 C:\php-5.2.5-Win32。分别把源代码包和二进制包解压到该文件夹下。从 php.ini-recommended 拷贝生成一个 php.ini 文件。
    3,建立 C:\php-5.2.5-Win32\Release_TS 文件夹,拷贝 C:\php-5.2.5-Win32\dev\php5ts.lib 文件到这里。
    4,进入 C:\php-5.2.5-Win32\ext 文件夹,运行命令:
      C:\php-5.2.5-Win32\ext>..\php.exe ext_skel_win32.php --extname=myphpext
      Creating directory myphpext
      Creating basic files: config.m4 config.w32 .cvsignore myphpext.c php_myphpext.h
      CREDITS EXPERIMENTAL tests/001.phpt myphpext.php [done].

      To use your new extension, you will have to execute the following steps:

      1.  $ cd ..
      2.  $ vi ext/myphpext/config.m4
      3.  $ ./buildconf
      4.  $ ./configure --[with|enable]-myphpext
      5.  $ make
      6.  $ ./php -f ext/myphpext/myphpext.php
      7.  $ vi ext/myphpext/myphpext.c
      8.  $ make

      Repeat steps 3-6 until you are satisfied with ext/myphpext/config.m4 and
      step 6 confirms that your module is compiled into PHP. Then, start writing
      code and repeat the last two steps as often as necessary.

    结果在 ext 下生成一个文件夹 myphpext,包含一个 PHP 扩展应用编程框架。myphpext 可以任意取名,将来生成的 dll 文件格式为 php_[extname].dll,我们生成的就是 php_myphpext.dll。运行结果的提示信息 1.2...8 主要是对 Linux/Unix 环境而言的,我们不必理会。其实 config.m4 文件在 Windows 下也可能需要修改,但是对于我们简单的框架暂时还用不着。

    文件夹 myphpext 包含若干个文件,其中:

    myphpext.dsp 是工程文件,后边还要用;
    myphpext.php 扩展测试文件;
    php_myphpext.h 扩展函数定义头文件
    myphpext.c 扩展函数具体实现

    以上 2 个重要的文件内容:

    php_myphpext.h 文件:

/*
      +----------------------------------------------------------------------+
      | PHP Version 5                                                        |
      +----------------------------------------------------------------------+
      | Copyright (c) 1997-2007 The PHP Group                                |
      +----------------------------------------------------------------------+
      | This source file is subject to version 3.01 of the PHP license,      |
      | that is bundled with this package in the file LICENSE, and is        |
      | available through the world-wide-web at the following url:           |
      | 
http://www.php.net/license/3_01.txt                                  |
      | If you did not receive a copy of the PHP license and are unable to   |
      | obtain it through the world-wide-web, please send a note to          |
      | license@php.net so we can mail you a copy immediately.               |
      +----------------------------------------------------------------------+
      | Author:                                                              |
      +----------------------------------------------------------------------+
    
*/


    
/* $Id: header,v 1.16.2.1.2.1 2007/01/01 19:32:09 iliaa Exp $ */

    #ifndef PHP_MYPHPEXT_H
    
#define PHP_MYPHPEXT_H

    
extern zend_module_entry myphpext_module_entry;
    
#define phpext_myphpext_ptr &myphpext_module_entry

    #ifdef PHP_WIN32
    
#define PHP_MYPHPEXT_API __declspec(dllexport)
    
#else
    
#define PHP_MYPHPEXT_API
    
#endif

    #ifdef ZTS
    #include 
"TSRM.h"
    
#endif

    PHP_MINIT_FUNCTION(myphpext);
    PHP_MSHUTDOWN_FUNCTION(myphpext);
    PHP_RINIT_FUNCTION(myphpext);
    PHP_RSHUTDOWN_FUNCTION(myphpext);
    PHP_MINFO_FUNCTION(myphpext);

    PHP_FUNCTION(confirm_myphpext_compiled); 
/* For testing, remove later. */
    PHP_FUNCTION(HelloPHP);

    
/*
       Declare any global variables you may need between the BEGIN
     and END macros here:

    ZEND_BEGIN_MODULE_GLOBALS(myphpext)
     long  global_value;
     char *global_string;
    ZEND_END_MODULE_GLOBALS(myphpext)
    
*/


    
/* In every utility function you add that needs to use variables
       in php_myphpext_globals, call TSRMLS_FETCH(); after declaring other
       variables used by that function, or better yet, pass in TSRMLS_CC
       after the last function argument and declare your utility function
       with TSRMLS_DC after the last declared argument.  Always refer to
       the globals in your function as MYPHPEXT_G(variable).  You are
       encouraged to rename these macros something shorter, see
       examples in any other php module directory.
    
*/


    #ifdef ZTS
    
#define MYPHPEXT_G(v) TSRMG(myphpext_globals_id, zend_myphpext_globals *, v)
    
#else
    
#define MYPHPEXT_G(v) (myphpext_globals.v)
    
#endif

    
#endif /* PHP_MYPHPEXT_H */

    
/*
     * Local variables:
     * tab-width: 4
     * c-basic-offset: 4
     * End:
     * vim600: noet sw=4 ts=4 fdm=marker
     * vim      
*/


  

  myphpext.c 文件:

    

/*
      +----------------------------------------------------------------------+
      | PHP Version 5                                                        |
      +----------------------------------------------------------------------+
      | Copyright (c) 1997-2007 The PHP Group                                |
      +----------------------------------------------------------------------+
      | This source file is subject to version 3.01 of the PHP license,      |
      | that is bundled with this package in the file LICENSE, and is        |
      | available through the world-wide-web at the following url:           |
      | 
http://www.php.net/license/3_01.txt                                  |
      | If you did not receive a copy of the PHP license and are unable to   |
      | obtain it through the world-wide-web, please send a note to          |
      | license@php.net so we can mail you a copy immediately.               |
      +----------------------------------------------------------------------+
      | Author:                                                              |
      +----------------------------------------------------------------------+
    
*/


    
/* $Id: header,v 1.16.2.1.2.1 2007/01/01 19:32:09 iliaa Exp $ */

    #ifdef HAVE_CONFIG_H
    #include 
"config.h"
    
#endif

    #include 
"php.h"
    #include 
"php_ini.h"
    #include 
"ext/standard/info.h"
    #include 
"php_myphpext.h"

    
/* If you declare any globals in php_myphpext.h uncomment this:
    ZEND_DECLARE_MODULE_GLOBALS(myphpext)
    
*/


    
/* True global resources - no need for thread safety here */
    
static int le_myphpext;

    
/* {{{ myphpext_functions[]
     *
     * Every user visible function must have an entry in myphpext_functions[].
     
*/

    zend_function_entry myphpext_functions[] 
= {
     PHP_FE(confirm_myphpext_compiled, NULL)  
/* For testing, remove later. */
     PHP_FE(HelloPHP, NULL)
     
{NULL, NULL, NULL} /* Must be the last line in myphpext_functions[] */
    }
;
    
/* }}} */

    
/* {{{ myphpext_module_entry
     
*/

    zend_module_entry myphpext_module_entry 
= {
    
#if ZEND_MODULE_API_NO >= 20010901
     STANDARD_MODULE_HEADER,
    
#endif
     
"myphpext",
     myphpext_functions,
     PHP_MINIT(myphpext),
     PHP_MSHUTDOWN(myphpext),
     PHP_RINIT(myphpext),  
/* Replace with NULL if there's nothing to do at request start */
     PHP_RSHUTDOWN(myphpext), 
/* Replace with NULL if there's nothing to do at request end */
     PHP_MINFO(myphpext),
    
#if ZEND_MODULE_API_NO >= 20010901
     
"0.1"/* Replace with version number for your extension */
    
#endif
     STANDARD_MODULE_PROPERTIES
    }
;
    
/* }}} */

    #ifdef COMPILE_DL_MYPHPEXT
    ZEND_GET_MODULE(myphpext)
    
#endif

    
/* {{{ PHP_INI
     
*/

    
/* Remove comments and fill if you need to have entries in php.ini
    PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY("myphpext.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_myphpext_globals, myphpext_globals)
        STD_PHP_INI_ENTRY("myphpext.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_myphpext_globals, myphpext_globals)
    PHP_INI_END()
    
*/

    
/* }}} */

    
/* {{{ php_myphpext_init_globals
     
*/

    
/* Uncomment this function if you have INI entries
    static void php_myphpext_init_globals(zend_myphpext_globals *myphpext_globals)
    {
     myphpext_globals->global_value = 0;
     myphpext_globals->global_string = NULL;
    }
    
*/

    
/* }}} */

    
/* {{{ PHP_MINIT_FUNCTION
     
*/

    PHP_MINIT_FUNCTION(myphpext)
    
{
     
/* If you have INI entries, uncomment these lines
     REGISTER_INI_ENTRIES();
     
*/

     
return SUCCESS;
    }

    
/* }}} */

    
/* {{{ PHP_MSHUTDOWN_FUNCTION
     
*/

    PHP_MSHUTDOWN_FUNCTION(myphpext)
    
{
     

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tutorial pengenalan rasmi Huawei untuk bahasa pengaturcaraan Cangjie dikeluarkan. Ketahui cara mendapatkan SDK versi universal dalam satu artikel Tutorial pengenalan rasmi Huawei untuk bahasa pengaturcaraan Cangjie dikeluarkan. Ketahui cara mendapatkan SDK versi universal dalam satu artikel Jun 25, 2024 am 08:05 AM

Menurut berita dari laman web ini pada 24 Jun, pada ucaptama Persidangan Pembangun Huawei HDC2024 pada 21 Jun, Gong Ti, Presiden Jabatan Perisian Terminal BG Huawei, secara rasmi mengumumkan bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei. Bahasa ini telah dibangunkan selama 5 tahun dan kini tersedia untuk pratonton pembangun. Laman web pembangun rasmi Huawei kini telah melancarkan video tutorial pengenalan rasmi bahasa pengaturcaraan Cangjie untuk memudahkan pembangun memulakan dan memahaminya. Tutorial ini akan membawa pengguna untuk mengalami Cangjie, mempelajari Cangjie dan menggunakan Cangjie, termasuk menggunakan bahasa Cangjie untuk menganggar pi, mengira peraturan batang dan cabang untuk setiap bulan 2024, lihat N cara menyatakan pokok binari dalam bahasa Cangjie dan menggunakan penghitungan jenis untuk melaksanakan pengiraan Algebra, simulasi sistem isyarat menggunakan antara muka dan sambungan, dan sintaks baharu menggunakan makro Cangjie, dsb. Laman web ini mempunyai alamat akses tutorial: ht

Selepas 5 tahun penyelidikan dan pembangunan, bahasa pengaturcaraan generasi seterusnya Huawei 'Cangjie' telah melancarkan pratontonnya secara rasmi Selepas 5 tahun penyelidikan dan pembangunan, bahasa pengaturcaraan generasi seterusnya Huawei 'Cangjie' telah melancarkan pratontonnya secara rasmi Jun 22, 2024 am 09:54 AM

Laman web ini melaporkan pada 21 Jun bahawa pada Persidangan Pembangun Huawei HDC2024 petang ini, Gong Ti, Presiden Jabatan Perisian Terminal BG Huawei, secara rasmi mengumumkan bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei dan mengeluarkan versi pratonton pembangun bagi bahasa HarmonyOSNEXT Cangjie. Ini adalah kali pertama Huawei mengeluarkan bahasa pengaturcaraan Cangjie secara terbuka. Gong Ti berkata: "Pada 2019, projek bahasa pengaturcaraan Cangjie telah dilahirkan di Huawei. Selepas 5 tahun pengumpulan R&D dan pelaburan R&D yang berat, akhirnya ia bertemu dengan pembangun global hari ini. Bahasa pengaturcaraan Cangjie mengintegrasikan ciri bahasa moden, pengoptimuman kompilasi komprehensif dan pelaksanaan Runtime dan sokongan rangkaian alat IDE yang luar biasa mencipta pengalaman pembangunan yang mesra dan prestasi program yang sangat baik untuk pembangun "Menurut laporan, bahasa pengaturcaraan Cangjie ialah alat perisikan semua senario.

Huawei melancarkan HarmonyOS NEXT Cangjie pembangun bahasa pengaturcaraan pratonton pengambilan beta Huawei melancarkan HarmonyOS NEXT Cangjie pembangun bahasa pengaturcaraan pratonton pengambilan beta Jun 22, 2024 am 04:07 AM

Menurut berita dari laman web ini pada 21 Jun, bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei telah diumumkan secara rasmi hari ini, dan pegawai itu mengumumkan pelancaran pengambilan beta pratonton pembangun bahasa HarmonyOSNEXT Cangjie. Peningkatan ini ialah peningkatan pengguna awal kepada versi pratonton pembangun, yang menyediakan SDK bahasa Cangjie, panduan pembangun dan pemalam DevEcoStudio yang berkaitan untuk pembangun menggunakan bahasa Cangjie untuk membangun, nyahpepijat dan menjalankan aplikasi HarmonyOSNext. Tempoh pendaftaran: 21 Jun 2024 - 21 Oktober 2024 Keperluan permohonan: Acara pengambilan Beta HarmonyOSNEXT Cangjie Language Developer Preview hanya terbuka kepada pembangun berikut: 1) Nama sebenar telah dilengkapkan dalam Pensijilan Perikatan Pembangun Huawei 2) Lengkapkan H

Universiti Tianjin dan Universiti Beihang terlibat secara mendalam dalam projek 'Cangjie' Huawei dan melancarkan rangka kerja pengaturcaraan ejen AI pertama 'Cangqiong' berdasarkan bahasa pengaturcaraan domestik. Universiti Tianjin dan Universiti Beihang terlibat secara mendalam dalam projek 'Cangjie' Huawei dan melancarkan rangka kerja pengaturcaraan ejen AI pertama 'Cangqiong' berdasarkan bahasa pengaturcaraan domestik. Jun 23, 2024 am 08:37 AM

Menurut berita dari laman web ini pada 22 Jun, Huawei semalam memperkenalkan bahasa pengaturcaraan yang dibangunkan sendiri oleh Huawei-Cangjie kepada pembangun di seluruh dunia. Ini adalah penampilan umum pertama bahasa pengaturcaraan Cangjie. Menurut pertanyaan di laman web ini, Universiti Tianjin dan Universiti Aeronautik dan Astronautik Beijing terlibat secara mendalam dalam penyelidikan dan pembangunan "Cangjie" Huawei. Universiti Tianjin: Penyusun Bahasa Pengaturcaraan Cangjie Pasukan kejuruteraan perisian Jabatan Perisikan dan Pengkomputeran Universiti Tianjin bekerjasama dengan pasukan Huawei Cangjie untuk mengambil bahagian secara mendalam dalam penyelidikan jaminan kualiti penyusun bahasa pengaturcaraan Cangjie. Menurut laporan, pengkompil Cangjie adalah perisian asas yang bersimbiotik dengan bahasa pengaturcaraan Cangjie. Dalam peringkat persediaan bahasa pengaturcaraan Cangjie, pengkompil berkualiti tinggi yang sepadan dengannya menjadi salah satu matlamat teras. Apabila bahasa pengaturcaraan Cangjie berkembang, pengkompil Cangjie sentiasa dinaik taraf dan dipertingkatkan. Dalam tempoh lima tahun yang lalu, Universiti Tianjin

Laman web rasmi bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei dan dokumen pembangunan adalah dalam talian, menyepadukan ke dalam ekosistem Hongmeng buat kali pertama Laman web rasmi bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei dan dokumen pembangunan adalah dalam talian, menyepadukan ke dalam ekosistem Hongmeng buat kali pertama Jun 22, 2024 am 03:10 AM

Menurut berita dari laman web ini pada 21 Jun, sebelum Persidangan Pembangun Huawei HDC2024, bahasa pengaturcaraan Cangjie yang dibangunkan sendiri oleh Huawei telah diumumkan secara rasmi, dan tapak web rasmi Cangjie kini dalam talian. Pengenalan laman web rasmi menunjukkan bahawa bahasa pengaturcaraan Cangjie ialah bahasa pengaturcaraan generasi baharu untuk kecerdasan semua senario, memfokuskan pada "kepintaran asli, semua senario semula jadi, prestasi tinggi dan keselamatan yang kukuh." Sepadukan ke dalam ekosistem Hongmeng untuk menyediakan pembangun pengalaman pengaturcaraan yang baik. Laman web rasmi yang dilampirkan pada tapak ini memperkenalkan seperti berikut: Rangka kerja pengaturcaraan pintar asli yang dibenamkan dengan AgentDSL, integrasi organik bahasa semula jadi & bahasa pengaturcaraan, ekspresi simbolik yang dipermudahkan, gabungan corak bebas, menyokong pembangunan pelbagai aplikasi pintar. Masa jalan yang sangat ringan dan berskala untuk semua adegan, reka bentuk berlapis modular, tidak kira betapa kecilnya memori, ia boleh menampung pengembangan domain semua senario

Pautan terakhir ekosistem Hongmeng berdarah tulen Huawei! Bahasa pengaturcaraan Cangjie yang dibangunkan sendiri akan mula diperkenalkan Pautan terakhir ekosistem Hongmeng berdarah tulen Huawei! Bahasa pengaturcaraan Cangjie yang dibangunkan sendiri akan mula diperkenalkan Jun 21, 2024 pm 03:23 PM

Menurut berita pada 21 Jun, tengah hari ini, Persidangan Pembangun Huawei 2024 akan dibuka secara rasmi. "Hongmeng berdarah murni" HarmonyOS NEXT sememangnya menjadi keutamaan menurut rancangan yang didedahkan oleh Yu Chengdong sebelum ini, beta awam mungkin diumumkan secara rasmi petang ini, dan pengguna biasa juga boleh mencuba "Harmony darah tulen". Menurut laporan, kumpulan pertama telefon mudah alih yang disokong ialah siri Mate60 dan siri Pura70. Perlu diingat bahawa sebagai "Hongmeng berdarah tulen", HarmonyOSNEXT telah mengalih keluar kernel Linux tradisional dan kod sumber terbuka Android AOSP dan membangunkan keseluruhan tindanan dalaman. Menurut laporan terbaru dari Sina Technology, Huawei juga akan melengkapkan pautan terakhir Ekosistem Hongmeng dan mengembangkan kehadirannya di dunia.

Universiti Tsinghua dan sumber terbuka Zhipu AI GLM-4: melancarkan revolusi baharu dalam pemprosesan bahasa semula jadi Universiti Tsinghua dan sumber terbuka Zhipu AI GLM-4: melancarkan revolusi baharu dalam pemprosesan bahasa semula jadi Jun 12, 2024 pm 08:38 PM

Sejak pelancaran ChatGLM-6B pada 14 Mac 2023, model siri GLM telah mendapat perhatian dan pengiktirafan yang meluas. Terutama selepas ChatGLM3-6B menjadi sumber terbuka, pembangun penuh dengan jangkaan untuk model generasi keempat yang dilancarkan oleh Zhipu AI. Jangkaan ini akhirnya telah berpuas hati sepenuhnya dengan keluaran GLM-4-9B. Kelahiran GLM-4-9B Untuk memberikan model kecil (10B dan ke bawah) keupayaan yang lebih berkuasa, pasukan teknikal GLM melancarkan model sumber terbuka siri GLM generasi keempat baharu ini: GLM-4-9B selepas hampir setengah tahun penerokaan. Model ini sangat memampatkan saiz model sambil memastikan ketepatan, dan mempunyai kelajuan inferens yang lebih pantas dan kecekapan yang lebih tinggi. Penerokaan pasukan teknikal GLM tidak

Model kod sumber terbuka Mistral mengambil takhta! Codestral tergila-gila dengan latihan dalam lebih 80 bahasa, dan pembangun Tongyi domestik meminta untuk mengambil bahagian! Model kod sumber terbuka Mistral mengambil takhta! Codestral tergila-gila dengan latihan dalam lebih 80 bahasa, dan pembangun Tongyi domestik meminta untuk mengambil bahagian! Jun 08, 2024 pm 09:55 PM

Dihasilkan oleh tindanan teknologi 51CTO (WeChat ID: blog51cto) Mistral mengeluarkan model kod pertamanya Codestral-22B! Apa yang menggilakan model ini bukan sahaja kerana ia dilatih dalam lebih 80 bahasa pengaturcaraan, termasuk Swift, dll. yang banyak model kod diabaikan. Kelajuan mereka tidak sama. Ia dikehendaki menulis sistem "terbit/langgan" menggunakan bahasa Go. GPT-4o di sini sedang dikeluarkan, dan Codestral menyerahkan kertas dengan pantas sehingga sukar untuk dilihat! Memandangkan model itu baru sahaja dilancarkan, ia masih belum diuji secara terbuka. Tetapi menurut orang yang bertanggungjawab ke atas Mistral, Codestral kini merupakan model kod sumber terbuka yang berprestasi terbaik. Rakan-rakan yang berminat dengan gambar boleh bergerak ke: - Peluk muka: https

See all articles