includepathphp
1. php中用require_once來調用其他文件列印出結果,下面是我照著例子做的但不能成功。
首先從main.php開始執行,然後require_once
問題來了,_autoload($class_name),這個是需要傳參的,你的參數呢?
請把這個參數補齊,例如你在require_once後可以寫 _autoload('classes/MyClass.php');
好了,接下來執行去吧,跟伺服器無關,邏輯問題,祝你工作順利。
2. 如何建立企業郵箱
去下一個FreeBSD 5.2.1安裝上去。
以下的安裝在FreeBSD 5.2.1系統上完成
1.更新 ports
# cvsup -gL 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile
2. 安裝 openssl+apache 伺服器
# cd /usr/ports/security/openssl
# make install
# make clean
# cd /usr/ports/www/apache2
# make install
# make clean
# vi /etc/rc.conf
apache2_enable="YES"
3. 安裝 openwebmail
# cd /usr/ports/mail/openwebmail/
# make WITH_QUOTA=yes install
# make clean
4. 安裝 postfix ,在安裝過程中用yes回答提出的問題
# cd /usr/ports/mail/postfix/
# make install
# make clean
# vi /etc/rc.conf
為了能啟動postfix加入:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
5. 安裝 vm-pop3d
# cd /usr/ports/mail/vm-pop3d
# make install
# make clean
6. 配置 postfix
# vi /usr/local/etc/postfix/main.cf
添加:
myhostname = nero.3322.org
mydomain = nero.3322.org
virtual_alias_maps=hash:/usr/local/etc/postfix/virtual
alias_maps=hash:/usr/local/etc/postfix/aliases
default_privs=nobody
allow_mail_to_commands = alias,forward,include
allow_mail_to_files = alias,forward,include
下面我加入一個 nero.3322.org 的虛擬域,並添加一個用戶llzqq
# vi /usr/local/etc/postfix/virtual
添加:
nero.3322.org anything //之間用[tab]
[email protected] llzqq.nero.3322.org //之間用[tab]
執行下面的命令,生成 virtual.db:
# cd /usr/local/etc/postfix/
# postmap virtual
# vi /usr/local/etc/postfix/aliases
添加:
llzqq.nero.3322.org:/var/spool/virtual/nero.3322.org/llzqq
執行下面的命令,生成 aliases.db:
# cd /usr/local/etc/postfix
# postalias aliases
7. 配置 vm-pop3d 使其開機自動執行
# cd /usr/local/etc/rc.d
# mv vm-pop3d.sh.sample vm-pop3d.sh
配置 openwebmail 支持 nero.3322.org 域,創建下面的文件:
# vi /usr/local/www/cgi-bin/openwebmail/etc/sites.conf/nero.3322.org
=========================== nero.3322.org =======================
auth_mole auth_vdomain.pl
auth_withdomain yes
mailspooldir /var/spool/virtual/nero.3322.org
use_syshomedir no
use_homedirspools no
enable_autoreply no
enable_setforward no
enable_vdomain yes
vdomain_admlist llzqq //這里設置了這個域的管理員
vdomain_maxuser 500
vdomain_vmpop3_pwdpath /usr/local/etc/virtual
vdomain_vmpop3_pwdname passwd
vdomain_vmpop3_mailpath /var/spool/virtual
vdomain_postfix_aliases /usr/local/etc/postfix/aliases
vdomain_postfix_virtual /usr/local/etc/postfix/virtual
vdomain_postfix_postalias /usr/local/sbin/postalias
vdomain_postfix_postmap /usr/local/sbin/postmap
# quota設置部分
quota_mole quota_.pl
quota_limit 52400 //定義了郵箱大小
quota_threshold 85
delmail_ifquotahit no
delfile_ifquotahit no
=========================== nero.3322.org =======================
# mkdir -p /var/spool/virtual/nero.3322.org
# chown nobody /var/spool/virtual/nero.3322.org
# chgrp mail /var/spool/virtual/nero.3322.org
# mkdir -p /usr/local/etc/virtual/nero.3322.org
# touch /usr/local/etc/virtual/nero.3322.org/passwd
# chmod 644 /usr/local/etc/virtual/nero.3322.org/passwd
# htpasswd /usr/local/etc/virtual/nero.3322.org/passwd llzqq
# chmod 755 /usr/local/www/cgi-bin/openwebmail/etc/users
# sync
# reboot
8. 最後通過瀏覽器登陸到OPENWEBMAIL
http://nero.3322.org/cgi-bin/openwebmail/openwebmail.pl
--------------------------------------------------------------------------------
llzqq 回復於:2004-07-19 08:52:57
第二部分:防病毒、垃圾郵件:clamav+amavisd-new+spam
歡迎大家轉貼這個文章,但要保留下面的版權信息:
作者:llzqq
出處:www.chinaunix.net
聯系:[email protected]
1.0 安裝clamav:
# cd /usr/ports/security/clamav
# make install
# make clean
# vi /usr/local/etc/clamav.conf
===============================clamav.conf============================
# Comment or remove the line below.
# Example
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 1M
LogTime
LogVerbose
PidFile /var/run/clamav/clamd.pid
DataDirectory /usr/local/share/clamav
LocalSocket /tmp/clamd
StreamMaxLength 10M
MaxThreads 10
MaxDirectoryRecursion 15
User clamav
ScanMail
ScanArchive
ScanRAR
ArchiveMaxFileSize 10M
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ClamukoScanOnOpen
ClamukoScanOnClose
ClamukoScanOnExec
ClamukoIncludePath /var/spool/virtual
ClamukoMaxFileSize 6M
ClamukoScanArchive
===============================clamav.conf============================
1.1 更新病毒庫
# /usr/local/etc/rc.d/clamav-freshclam.sh start
2.0 安裝amavisd-new
# cd /usr/ports/security/amavisd-new
# make install
# make clean
# cd /usr/local/etc
# mv amavisd.conf-dist amavisd.conf
# vi amavisd.conf
============================== amavisd.conf ===============================
$MYHOME = '/var/amavis'; # (default is '/var/amavis')
$mydomain = 'nero.3322.org'; # (no useful default)
$daemon_user = 'vscan'; # (no default; customary: vscan or amavis)
$daemon_group = 'vscan'; # (no default; customary: vscan or amavis)
$log_level = 0;
$sa_spam_subject_tag = '***SPAM***'
$virus_admin = "root\@$mydomain";
$spam_admin = "llzqq\@$mydomain";
$mailfrom_notify_admin = "llzqq\@$mydomain";
$mailfrom_notify_recip = "llzqq\@$mydomain";
$mailfrom_notify_spamadmin = "llzqq\@$mydomain";
$inet_socket_bind = '127.0.0.1';
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
$inet_socket_port = 10024;
$max_servers = 2;
['Clam Antivirus-clamd',
\&ask_daemon, ["CONTSCAN {}\n", '/tmp/clamd'],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
============================== amavisd.conf ===============================
2.1 要啟動clamav和amavisd-new需要配置一下/etc/rc.conf
# vi /etc/rc.conf
spamd_enable="YES"
amavisd_enable="YES
clamav_clamd_enable="YES"
3.0 由於在安裝amavisd-new時spamassassin被一起安裝了下面對其進行配置
3.1 建立過濾規則:
# cd /usr/local/etc/mail/spamassassin
# env LANG=C vi local.cf
=============================== local.cf ===============================
# SpamAssassin config file for version x.xx
# generated by http://www.yrex.com/spam/spamconfig.php (version 1.01)
# How many hits before a message is considered spam.
required_hits 4.0
# Whether to change the subject of suspected spam
rewrite_subject 1
# Text to prepend to subject if rewrite_subject is used
subject_tag *****SPAM*****
# Encapsulate spam in an attachment
report_safe 1
# Use terse version of the spam report
use_terse_report 0
# Enable the Bayes system
use_bayes 1
# Enable Bayes auto-learning
auto_learn 1
# Enable or disable network checks
skip_rbl_checks 1
use_razor2 0
use_dcc 0
use_pyzor 0
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - chinese english
ok_languages zh en
# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales en zh
score SUBJ_FULL_OF_8BITS 2
score NO_REAL_NAME 4.0
=============================== local.cf ===============================
3.2 下載新的垃圾郵件地址列表文件
# cd /usr/local/share/spamassassin
# fetch http://anti-spam.org.cn/rules/sa/55_diy_score.cf
4.0 對POSFIX進行配置,在他的配置文件中添加下面的一些內容
# vi /usr/local/etc/postfix/master.cf
---------------------- master.cf ---------------------
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o mynetworks=127.0.0.0/8
---------------------- master.cf ---------------------
# vi /usr/local/etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
好了,現在一個基於FreeBSD的功能相對完整的郵件伺服器就建立起來了,虛擬域的管理員可以登陸OPENWEBMAIL進行用戶的添加、刪除等操作,虛擬用戶可以通過OPENWEBMAIL修改自己的密碼。
3. zend framework 2.4.0 里為什麼沒有 zf.bat
zend framework 的項目結構比較復雜,但是有既定的結構。zf提供了使用Command生成項目結構的工具,使用非常方便,初學者可以不用為了復雜的結構而Orz。
使用前的一些配置。
涉及到的文件:
1.zf 的 library
2.bin zf下載時所帶的bin文件夾
3.php.exe
第一步:
將library和bin文件夾拷貝到伺服器根目錄,我的伺服器跟目錄為E:\wamp\www
第二步:
設置環境變數,修改系統變數中的Path值。添加上bin文件夾路徑和php.exe所在目錄,我添加的是E:\wamp\bin\php\php5.2.6;E:\wamp\www\bin(兩個路徑分號間隔)。
修改環境變數是為了,使用cmd時,在任意文件目錄都可以使用zf命令。如果沒有環境變數的話,只能在bin目錄下才能使用zf命令,而且php.exe目錄如果不在環境變數中,就沒法被執行。
第三步(不必須)
如果你是按照第一二步做的,那麼這步可以省略。如果,你的bin目錄與lirary目錄不是按照上面放置的,那麼你需要,修改一下bin目錄下的zf.php文件。
$zfIncludePath['relativePath'] = dirname(__FILE__) . '/../library/';
修改相對路徑,使得zf命令可以找到lirary文件夾。
ok,打開cmd,輸入zf show version,如果輸出你的zf版本。那麼恭喜你,你設置成功了。
4. thinkphp應用怎麼通過composer載入第三方庫
直接在入口文件中包含composer的autoload腳本
Composer
是PHP的一個包依賴管理工具,類似Ruby中的RubyGems或者Node中的NPM,它並非官方,但現在已經非常流行。此文並不介紹如何使用Composer,而是關注於它的autoload的內容吧。
舉例來說,假設我們的項目想要使用 monolog 這個日誌工具,就需要在composer.json里告訴composer我們需要它:
{
"require": {
"monolog/monolog": "1.*"
}
}
之後執行:
php composer.phar install
好,現在安裝完了,該怎麼使用呢?Composer自動生成了一個autoload文件,你只需要引用它
require '/path/to/vendor/autoload.php';
然後就可以非常方便的去使用第三方的類庫了,是不是感覺很棒啊!對於我們需要的monolog,就可以這樣用了:
use MonologLogger;
use MonologHandlerStreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('/path/to/log/log_name.log', Logger::WARNING));
// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');
在這個過程中,Composer做了什麼呢?它生成了一個autoloader,再根據各個包自己的autoload配置,從而幫我們進行自動載入的工作。(如果對autoload這部分內容不太了解,可以看我之前的
一篇文章
)接下來讓我們看看Composer是怎麼做的吧。
對於第三方包的自動載入,Composer提供了四種方式的支持,分別是
PSR-0和PSR-4的自動載入(我的一篇文章也有介紹過它們),生成class-map,和直接包含files的方式。
PSR-4是composer推薦使用的一種方式,因為它更易使用並能帶來更簡潔的目錄結構。在composer.json里是這樣進行配置的:
{
"autoload": {
"psr-4": {
"Foo\": "src/",
}
}
}
key和value就定義出了namespace以及到相應path的映射。按照PSR-4的規則,當試圖自動載入 "Foo\Bar\Baz"
這個class時,會去尋找 "src/Bar/Baz.php" 這個文件,如果它存在則進行載入。注意,
"Foo\"
並沒有出現在文件路徑中,這是與PSR-0不同的一點,如果PSR-0有此配置,那麼會去尋找
"src/Foo/Bar/Baz.php"
這個文件。
另外注意PSR-4和PSR-0的配置里,"Foo\"結尾的命名空間分隔符必須加上並且進行轉義,以防出現"Foo"匹配到了"FooBar"這樣的意外發生。
在composer安裝或更新完之後,psr-4的配置換被轉換成namespace為key,dir path為value的Map的形式,並寫入生成的
vendor/composer/autoload_psr4.php 文件之中。
{
"autoload": {
"psr-0": {
"Foo\": "src/",
}
}
}
最終這個配置也以Map的形式寫入生成的
vendor/composer/autoload_namespaces.php
文件之中。
Class-map方式,則是通過配置指定的目錄或文件,然後在Composer安裝或更新時,它會掃描指定目錄下以.php或.inc結尾的文件中的class,生成class到指定file
path的映射,並加入新生成的 vendor/composer/autoload_classmap.php 文件中,。
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
例如src/下有一個BaseController類,那麼在autoload_classmap.php文件中,就會生成這樣的配置:
'BaseController' => $baseDir . '/src/BaseController.php'
Files方式,就是手動指定供直接載入的文件。比如說我們有一系列全局的helper
functions,可以放到一個helper文件里然後直接進行載入
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
它會生成一個array,包含這些配置中指定的files,再寫入新生成的
vendor/composer/autoload_files.php
文件中,以供autoloader直接進行載入。
下面來看看composer autoload的代碼吧
<?php
// autoload_real.php @generated by Composer
class
{
private static $loader;
public static function loadClassLoader($class)
{
if ('ComposerAutoloadClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('', 'loadClassLoader'), true, true);
self::$loader = $loader = new ComposerAutoloadClassLoader();
spl_autoload_unregister(array('', 'loadClassLoader'));
$vendorDir = dirname(__DIR__); //verdor第三方類庫提供者目錄
$baseDir = dirname($vendorDir); //整個應用的目錄
$includePaths = require __DIR__ . '/include_paths.php';
array_push($includePaths, get_include_path());
set_include_path(join(PATH_SEPARATOR, $includePaths));
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
$loader->register(true);
$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $file) {
($file);
}
return $loader;
}
}
function ($file)
{
require $file;
}
首先初始化ClassLoader類,然後依次用上面提到的4種載入方式來注冊/直接載入,ClassLoader的一些核心代碼如下:
/**
* @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\'
* @param array|string $paths The PSR-4 base directories
*
* @throws InvalidArgumentException
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\' !== $prefix[$length - 1]) {
throw new InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
//這是PHP5.3.0 - 5.3.2的一個bug 詳見https://bugs.php.net/50731
if ('\' == $class[0]) {
$class = substr($class, 1);
}
// class map 方式的查找
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
//psr-0/4方式的查找
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if ($file === null && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if ($file === null) {
// Remember that this class does not exist.
return $this->classMap[$class] = false;
}
return $file;
}
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
if (0 === strpos($class, $prefix)) {
foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
5. Ubuntu下Qt如何使用openCV庫
我在網上查找安裝方法時有兩種方式,第一種方案在第三步測試的時候沒有成功,不知道問題出在哪裡,換用了第二種方式。如果直接用第二種方式安裝不成功,可以試試進行第一種方式的第2步。
安裝環境是Ubuntu 10.04,內核版本2.6.32.22。OpenCV版本為2.4.3。
第一種方式,參考org.cn/index.php/Debian%E4%B8%8B%E5%AE%89%E8%A3%85
1.更新下載更新軟體包列表信息
$ apt-get update
2.查詢OpenCV相關軟體包
查詢獲得的內容和OpenCV軟體包版本有關
復制代碼
$ apt-cache search opencv
libcv-dev - development files for libcv
libcv4 - computer vision library
libcvaux-dev - development files for libcvaux
libcvaux4 - computer vision extension library
libhighgui-dev - development files for libhighgui
libhighgui4 - computer vision GUI library
opencv-doc - OpenCV documentation and examples
python-opencv - Python bindings for the computer vision library
harpia - Image Processing/Computer Vision Automatic Prgm. Tool
復制代碼
3.測試
進入軟體目錄/sample/cpp,執行以下命令
g++ `pkg-config opencv --libs --cflags opencv` drawing.cpp -o drawing
成功編譯並能執行表示安裝成功。
第二種方式,OpenCV 2.4.3同樣適用,參考自http://www.linuxidc.com/Linux/2012-12/75641.htm
1.安裝必要的依賴包
這一步我略去了,因為原文中提到的ffmepg1我並不需要安裝,並且我是從第一種方式轉過來的,就沒有安裝這些包,不過還是列在下面:
sudo apt-get install build-essential libgtk2.0-dev l www.hbbz08.com ibjpeg62-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
2.安裝OpenCV
(1)下載OpenCV 2.4.3 http://sourceforge.net/projects/opencvlibrary/
(2) tar -xvf OpenCV-2.4.3.tar.bz2
(3)將其復制到 「 home/你的計算機名/」下;
(4)cd OpenCV-2.4.3
(5)mkdir release
(6)cd release
(7)
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_TBB=ON -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON ..
如果沒有cmake,apt-get install就行
(8) make
(9)sudo make install
3.添加庫的路徑
(1)sudo gedit /etc/ld.so.conf.d/opencv.conf
文件可能需要創建,添加下面內容並保存
/usr/local/lib
(2)sudo ldconfig
(3) sudo gedit /etc/environment
添加下面內容
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
這時,再回到OpenCV-2.4.3/sample/cpp下時,用第一種方式的測試方法,drawing.cpp文件就能正確編譯,而且也可以通過生成的文件看到效果了。
2013.1.6更新:QT調用openCV庫(ixunjishu/qianrushipeixun/959.html)
QT的安裝過程就略去了,注意需要QT設計器和QTcreator,前者我是下源碼編譯的,後者用軟體中心裝的。
配置QT, sudo gedit /usr/share/qt4/mkspecs/default/qmake.conf
在文件內添加了下面兩句:
QMAKE_INCDIR = /usr/include/opencv
QMAKE_LIBS = -lcvaux -lcv -lcxcore -lhighgui -lml
實常式序,創建一個QT4 Console Application,代碼如下:
復制代碼
#include <cv.h>
#include <highgui.h>
int main()
{
IplImage *img = 0;
img = cvLoadImage("Lena.bmp",-1);//Lena.bmp在所建工程的目錄下
cvNamedWindow("lena", 1);
cvShowImage("lena", img);
cvWaitKey(0);
return 0;
}
復制代碼
關鍵的一步,在工程的.pro文件添加下面的內容:
復制代碼
INCLUDEPATH += /usr/include/opencv
LIBS += /usr/lib/libcv.so \
/usr/lib/libcvaux.so \
/usr/lib/libcxcore.so \
/usr/lib/libhighgui.so \
/usr/lib/libml.so
復制代碼
這時就能編譯運行了。
6. 在用phpexcel,windows下可導出表格,linux下無任何反應,無報錯
用PHPExcel,PHPExcel是相當強大的 MS Office Excel 文檔生成類庫。
你上它的官/網把程序包下/載下來,裡面有 PHPExcel 的程序、還有30個實常式序和三個文檔。
看一下其中的開發文檔你就會用了。
讀取(這段在開發文檔里有的,在13頁):
require_once '../Classes/PHPExcel/IOFactory.php';
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
$objWorksheet = $objPHPExcel->getActiveSheet();
echo '<table>' . "\n";
foreach ($objWorksheet->getRowIterator() as $row) {
echo '<tr>' . "\n";
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
foreach ($cellIterator as $cell) {
echo '<td>' . $cell->getValue() . '</td>' . "\n";
}
echo '</tr>' . "\n";
}
echo '</table>' . "\n";
?>
7. 微擎 wemolesite 寫在哪個文件里
WeMoleSite 用戶定義的微站功能處理程序. 當用戶訪問微站時, 調用此處理程序來處理訪問.
WeMoleSite 主要的功能是定義嵌入點, 包括兩種類型的嵌入點:
doWebXXX - 是Web訪問的嵌入點, 一般用作後台管理, 在微擎的管理中心進行訪問(訪問方式 - site.php?act=mole&name={$mole}&do=XXX) doMobileXXX - 是移動端的嵌入點, 一般用作訪問展示, 在手機端或App內置瀏覽器中訪問(訪問方式 - mobile.php?act=mole&name={$mole}&do=XXX)WeMoleSite 執行方式要點描述如下:
- 要進行Web管理的, 比如編輯文章等操作, 請定義 doWebXXX 嵌入點
- 要進行移動端訪問的, 比如展示頁面等操作, 請定義 doMobileXXX 嵌入點
- 微擎系統定義了兩個默認的移動端頁面. 首頁和個人中心來聚合所有模塊的微站功能
- 首頁和個人中心都包含功能嵌入方式 - 微站包含了會話訪問機制, 通過圖文消息進入微站的粉絲用戶都會獲得會話記錄. 並將個人信息保存於 $_W['fans'] 中. (使用COOKIE機制保存)
- 個人中心內置了會話判斷, 沒有會話信息的訪問將被拒絕
WeMoleSite 的成員及作用描述如下:abstract class WeMoleSite {
// array: 預定義的數據, 本次請求所匹配的處理模塊, 此屬性由系統初始化, 在數組元素中 config 元素可以獲取當前模塊的配置參數
public $mole;
// int: 預定義的數據, 本次請求的公眾號編號
public $weid;
// bool: 預定義的數據, 是否存在
public $inMobile;
/**
* 這個操作被定義用來呈現微站主頁上的導航圖標,返回值為數組集合結構, 每個元素將被呈現為一個鏈接. 元素結構為 array('title'=>'標題','url'=>'鏈接目標')
* @return array 數組集合, 元素結構為 array('title'=>'標題','url'=>'鏈接目標')
*/
public function getHomeTiles() {
return array();
}
/**
* 這個操作被定義用來呈現微站個人中心上的管理鏈接,返回值為數組結構, 每個元素將被呈現為一個鏈接. 元素結構為 array('title'=>'標題', url'=>'鏈接目標')
* @return array 數組集合, 元素結構為 array('title'=>'標題','url'=>'鏈接目標')
*/
public function getProfileTiles() {
return array();
}
/**
* 預定義的操作, 展示特定模板內容, 此方法不能直接展示模塊內容, 需要使用 include $this->template(''); 的方式
* @param string $filename 模板名稱, 如: settings 將會展示本模塊定義下的 template/settings.html 模板文件, 請參閱 "模板機制"
* @return void
*/
protected function template($filename, $flag = TEMPLATE_INCLUDEPATH) {...}
}
8. PHP剛開始學習,遇到這個代碼困難,不知道怎麼改。我是看著書上敲的,但是出現錯誤,請指教
什麼樣的錯誤提示啊?
書上的這個代碼應該不是單獨存在的。還有牽涉其他的文件。
這樣是看不出來什麼東西的。
9. 如何使用composer的autoload來自動載入自己編寫的函數庫與類庫
composer的出現真是讓人們眼前一亮,web開發從此變成了一件很『好玩』的事情,開發一個CMS就像在搭積木,從packagist中取出『積木』搭建在自己的代碼中,一點一點搭建出一個屬於自己的王國。
從此以後我基本就拋棄了require和include函數,一個項目中,這兩個函數只可能出現一次,那就是require '../vendor/autoload.php'。
那麼,既然拋棄了傳統的文件包含方法,我們使用所有類庫都將用namespace和composer自帶的autoload。可是,我們自己編寫的函數庫與類庫,怎麼用composer的方法來自動載入呢?
這就要從composer.json說起,我們需要通過修改這個文件來達到目的。
composer.json相當於是composer的配置文件,這個配置文件中有一個autoload段,比如我的一個項目:
其中又包含主要的兩個選項: files 和 psr-4。
files就是需要composer自動幫我們載入的函數庫(不含類),只要在後面的數組中將函數庫的文件路徑寫入即可。
psr-4顧名思義,是一個基於psr-4(http://www.php-fig.org/psr/psr-4/)規則的類庫自動載入對應關系,只要在其後的對象中,以 "命名空間": "路徑" 的方式寫入自己的類庫信息即可。
修改完成後,只要執行一下composer update,即可完成對應工作。
之後,我們在項目中,用如下方式即可載入自定義類庫:
new \Core\View();
composer的autoload將會自動包含"./core/view.php",並找到其中的Core命名空間下的View類。
我們來深挖一下,探索一下autoload的原理。
在我們修改完composer.json並執行update後,將會修改./vender/composer/autoload_psr4.php,比如我的某個項目,其中增加了這樣一個對應關系:
這其實就是我剛剛在.json中添加的對應關系,他等於將.josn的配置文件,換成了php的形式。
那麼我看到vendor/autoload.php:
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ::getLoader();
其執行了一個自動生成的類中的getLoader方法。
跟進:
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('', 'loadClassLoader'));
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
$loader->register(true);
$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $file) {
($file);
}
return $loader;
}
可以明顯看到,他將autoload_namespaces.php、autoload_psr4.php、autoload_classmap.php、autoload_files.php等幾個配置文件包含了進來,並進行了相關處理(setPsr4),最後注冊(register)。
那麼我們跟進register方法:
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
這函數就一行,但簡單明了,直接調用php自帶的spl_autoload_register函數,注冊處理__autoload的方法,也就是loadClass方法。再跟進loadClass方法:
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
從函數名字就可以大概知道流程:如果存在$class對應的這個$file,則include進來。
那麼進findFile方法里看看吧:
public function findFile($class)
{
// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
if ('\\' == $class[0]) {
$class = substr($class, 1);
}
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative) {
return false;
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if ($file === null && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if ($file === null) {
// Remember that this class does not exist.
return $this->classMap[$class] = false;
}
return $file;
}
通過類名找文件,最終鎖定在findFileWithExtension方法中。
不過發現了一個小寶藏:在php5.3.0~5.3.2版本下,類名的第一個字元是\的小bug,也許以後挖漏洞會用上。
還是跟進findFileWithExtension方法:
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
if (0 === strpos($class, $prefix)) {
foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
}
最終實現將命名空間\類這樣的類名,給轉換成目錄名/類名.php這樣的路徑,並返回完整路徑。
我發現composer的autoload與php自帶的spl_autoload,在包含文件時有一點小區別。那就是,spl_autoload會查找.inc類型的文件名,但composer不會。
另外也可以發現,雖然配置文件的名字是autoload_psr4.php,但實際上psr0格式的自動載入也是支持的。二者最大的不同就是psr0中用"_"來代替目錄間的"\"。
10. 如何在lnmp上部署Thinkphp
ThinkPHP的四種URL模式:0(普通模式);1(PATHINFO模式);2(REWRITE模式);3(兼容模式)nginx需要PATHINFO模式,但需要更改nginx配置文件讓其支持PATHINFO模式。系統環境:系統:CentOS-6.4-x86_64web伺服器:nginx1.2.7PHP版本:PHP5.3.17資料庫版本:MySQL5.5.28一、安裝LNMP1.0一鍵安裝包按照以上版本安裝環境二、修改配置文件1.修改php配置文件php.ini,將其中cgi.fix_pathinfo=0,值改為1重啟php-fpm2.ssh里執行:cat>/usr/local/nginx/conf/pathinfo.conf<<'EOF'set$real_script_name$fastcgi_script_name;if($fastcgi_script_name~"(.+?\.php)(/.*)"){set$real_script_name$1;set$path_info$2;}fastcgi_paramSCRIPT_FILENAME$document_root$real_script_name;fastcgi_paramSCRIPT_NAME$real_script_name;fastcgi_paramPATH_INFO$path_info;EOF再將虛擬主機配置文件里的location~.*\.(php|php5)?$替換為:location~.*\.php再在includefcgi.conf;下面添加一行includepathinfo.conf;重啟nginx完整的虛擬主機配置文件如下:server { listen 80; server_namewww.lnmp.org; indexindex.htmlindex.htmindex.php; root /home/wwwroot/lnmp; location~.*\.php { try_files$uri=404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_indexindex.php; includefcgi.conf; includepathinfo.conf; } location/status{ stub_statuson; access_log off; } location~.*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location~.*\.(js|css)?$ { expires 12h; } access_log /home/wwwlogs/lnmp.log lnmp;}將ThinkPHP的URL模式設置成PATHINFO。ThinkPHP就可以在nginx中運行了。