Blog

  • PhpList Can Work With SSL POP

    想要phpList process bounce messages,邮箱却只支持SSL POP (port 995, 如gmail)?没问题。

    config.php 作以下设置:

    $bounce_protocol = 'pop';
    $message_envelope = 'username@gmail.com';
    $bounce_mailbox_host = 'pop.gmail.com';
    $bounce_mailbox_user = 'username@gmail.com';
    $bounce_mailbox_password = 'password';
    $bounce_mailbox_port = "995/pop3/ssl/novalidate-cert";

    我本还担心phpList 不能从gmail上pop出bounce messages,正想着去专门建一个未经SSL处理的POP邮箱,没想到phpList轻易就达到了我的要求。

    另外我还发现,按照phpList自己的说法,php必须运行在safe_mode off的环境下才能让phpList 处理bounce messages,但我亲身实验结果显示safe_mode can be on.

  • Magento Cache

    关于Magento的Cache机制还有待进一步了解。目前我知道的是:

    在local.xml更改Magento backend admin url以后,要Refresh Cache才会生效。

    刚才我试了很久才想到要清除缓存,否则我还以为我没找对地方。

  • 老板不了解下属的工作量是种悲哀

    金融危机袭来,公司的业务摇摇欲坠。老板收缩战线,解雇了几个人,暂时认为我比较重要,留下了。我倒没多想,先干着呗。

    但是事情总要有人做啊,老板亲自上阵,做我同事原来做的事情。今天盘点库存,盘点完毕入账的时候,他花了6个小时还没完成老同事2个小时就能完成的收入工作。最后老板感慨,这输入原来要花那么多时间啊。我说,除非你投资一套条码设备,否则这时间能省下来吗?

    老板无语,然后他又开始怀疑老同事是否真能这么快完成输入。我无语,其实我也干过这活,也就2个小时的工作量吧,但这是建立在我熟记产品代码和产品名称的实践经验基础上的。

    我并不是建议老板们都来做做下属的工作(专业分工嘛),但老板如果以为下属的工作都那么好做的话,那是种悲哀——下属的悲哀,更是老板的悲哀。

  • Use Analytics to Track Newsletter Open Rate

    I realise it is NOT possible to use Analytics to track newsletter open rate. Because:

    • To track if an email is opened, you put an invisible image into the email with img src calling a tracking program.
    • If you put a web page url as img src, the javascript of the web page won’t run.

    So, in order to track newsletter open rate, you must point img src to a server-side tracking program. Analytics won’t fit for this job because it is client-side script.

    Actually, tracking newsletter open rate is very easy with phpList, which I have been using for long. Simply to [USERTRACK] into the body of the email.

  • Magento Bug

    我在Magento 1.1.8里发现一个可能的Bug: Category Design的值只有All store views的值起作用,针对各个store view分别做的不同的值均被忽略。

    不过这暂时对我没什么影响,因为我的一个Root Category只对应一个store view。

  • 思维定势

    Tesco经常给我寄各种各样的Coupon,我很喜欢。

    Cow & Gate婴儿奶粉罐里有时也会开出一张Coupon,通常是买下一罐奶粉Save £1。我中到一张,Valid to 30/11/08,今天最后一天。

    今天礼拜天,Hove Tesco 下午4点就关门,而我有事,4点之前不想专门为用掉一张Coupon跑一趟Hove Tesco。眼看着让这张Coupon作废,我突然想到:Cow & Gate给的Coupon,指明各大零售店均可使用,Cow & Gate负责兑现,我偏偏只想着去Tesco买。Tesco Coupon用惯了,以致见了Coupon就想着去Tesco买。

    这种思维定势真的很可怕。幸好我及时跳出定势,就近在Waitrose花掉了这张即将作废的Coupon。

  • httpd.conf Can Override php.ini

    httpd.conf and php.ini, which has priority? I have done some experiments, and the conclusions are –

    • php settings in php.ini can be overrided by httpd.conf (or some other Apache configuration files) with php_admin_value, php_admin_flag, php_value, and php_flag.
    • However, I find on Linux, if php_admin_value, php_admin_flag, php_value, or php_flag can not be put inside of VirtualHost block. They can be put inside of Directory block, but if Directory is inside of VirtualHost, they won’t work. I assume it is a php bug because on Windows php_admin_value, php_admin_flag, php_value, or php_flag can be inside of VirtualHost or Directory blocks.
    • Some of php directives can only be set by php_admin_value or php_admin_flag, for example, safe_mode. Others can be set by php_admin or php_(non_admin), for example, display_errors. But if display_errors is set by php_admin, it is not overridable by .htaccess; if display_errors is set by php_(non_admin), .htaccess can override it.
  • 关于Magento一次安装,多处使用的构想

    WordPress可以一次安装,多处使用,Magento当然更有理由这么做了。

    Magento强大的功能之一就是run multi websites,Magento内置了多站点运行的功能。我援引从WordPress安装管理探索出的经验,觉得即使Magento内置multi websites功能,各站点还是不要使用同一个document root为好,还是以一主多副软连接的方式为宜。

    只是,我还是没有找到在后台隔离各站点的办法(假设它们由不同的web manager来经营)。我也无法控制上传目录,所有上传得文件都是存放在主域名的document root/{magento installatin path}/media下。

    好在magento子目录安装,根目录显示还是做得到的。如将magento放置在document root/magento下,但前台url不出现magento,具体的做法是

    1. 把index.php和.htaccess移到document root,其他文件都放置在document root/magento子目录

    2. 把index.php修改成

    <?php
    /**
    * Magento
    *
    * NOTICE OF LICENSE
    *
    * This source file is subject to the Open Software License (OSL 3.0)
    * that is bundled with this package in the file LICENSE.txt.
    * It is also available through the world-wide-web at this URL:
    * http://opensource.org/licenses/osl-3.0.php
    * If you did not receive a copy of the license and are unable to
    * obtain it through the world-wide-web, please send an email
    * to license@magentocommerce.com so we can send you a copy immediately.
    *
    * DISCLAIMER
    *
    * Do not edit or add to this file if you wish to upgrade Magento to newer
    * versions in the future. If you wish to customize Magento for your
    * needs please refer to http://www.magentocommerce.com for more information.
    *
    * @category   Mage
    * @package    Mage
    * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
    * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
    */

    if (version_compare(phpversion(), ‘5.2.0’, ‘<‘)===true) {
    echo  ‘<div style=”font:12px/1.35em arial, helvetica, sans-serif;”><div style=”margin:0 0 25px 0; border-bottom:1px solid #ccc;”><h3 style=”margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;”>Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.2.0 or newer. <a href=”http://www.magentocommerce.com/install” target=””>Find out</a> how to install</a> Magento using PHP-CGI as a work-around.</p></div>’;
    exit;
    }

    $mageFilename = ‘magento/app/Mage.php’;

    if (!file_exists($mageFilename)) {
    if (is_dir(‘downloader’)) {
    header(“Location: downloader”);
    } else {
    echo $mageFilename.” was not found”;
    }
    exit;
    }

    require_once $mageFilename;

    #Varien_Profiler::enable();

    #Mage::setIsDeveloperMode(true);

    #ini_set(‘display_errors’, 1);

    umask(0);
    Mage::run(‘default’);

    3. 把.htaccess修改成:


    ############################################
    ## uncomment these lines for CGI mode
    ## make sure to specify the correct cgi php binary file name
    ## it might be /cgi-bin/php-cgi

    #    Action php5-cgi /cgi-bin/php5-cgi
    #    AddHandler php5-cgi .php

    ############################################
    ## GoDaddy specific options

    #   Options -MultiViews

    ## you might also need to add this line to php.ini
    ##     cgi.fix_pathinfo = 1
    ## if it still doesn’t work, rename php.ini to php5.ini

    ############################################
    ## this line is specific for 1and1 hosting

    #AddType x-mapp-php5 .php
    #AddHandler x-mapp-php5 .php

    ############################################
    ## default index file

    DirectoryIndex index.php

    <IfModule mod_php5.c>

    ############################################
    ## adjust memory limit

    #    php_value memory_limit 64M
    php_value memory_limit 128M
    php_value max_execution_time 18000

    ############################################
    ## disable magic quotes for php request vars

    php_flag magic_quotes_gpc off

    ############################################
    ## disable automatic session start
    ## before autoload was initialized

    php_flag session.auto_start off

    ############################################
    ## enable resulting html compression

    #php_flag zlib.output_compression on

    ###########################################
    # disable user agent verification to not break multiple image upload

    php_flag suhosin.session.cryptua off

    ###########################################
    # turn off compatibility with PHP4 when dealing with objects

    php_flag zend.ze1_compatibility_mode Off

    </IfModule>

    <IfModule mod_security.c>
    ###########################################
    # disable POST processing to not break multiple image upload

    SecFilterEngine Off
    SecFilterScanPOST Off
    </IfModule>

    <IfModule mod_deflate.c>

    ############################################
    ## enable apache served files compression
    ## http://developer.yahoo.com/performance/rules.html#gzip

    # Insert filter
    #SetOutputFilter DEFLATE

    # Netscape 4.x has some problems…
    #BrowserMatch ^Mozilla/4 gzip-only-text/html

    # Netscape 4.06-4.08 have some more problems
    #BrowserMatch ^Mozilla/4\.0[678] no-gzip

    # MSIE masquerades as Netscape, but it is fine
    #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    # Don’t compress images
    #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

    # Make sure proxies don’t deliver the wrong content
    #Header append Vary User-Agent env=!dont-vary

    </IfModule>

    <IfModule mod_ssl.c>

    ############################################
    ## make HTTPS env vars available for CGI mode

    SSLOptions StdEnvVars

    </IfModule>

    <IfModule mod_rewrite.c>

    ############################################
    ## enable rewrites

    Options +FollowSymLinks
    RewriteEngine on

    ############################################
    ## you can put here your magento root folder
    ## path relative to web root

    #RewriteBase /magento/

    ############################################
    ## workaround for HTTP authorization
    ## in CGI environment

    RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    ############################################

    #This is my creation for installing magento under a subfolder.

    ############################################

    RewriteCond %{REQUEST_URI} ^/(media|skin|js)/

    RewriteRule (.*) magento/$1 [l]

    ############################################
    ## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

    ############################################
    ## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

    ############################################
    ## rewrite everything else to index.php

    RewriteRule .* index.php [L]

    </IfModule>

    ############################################
    ## Prevent character encoding issues from server overrides
    ## If you still have problems, use the second line instead

    AddDefaultCharset Off
    #AddDefaultCharset UTF-8

    <IfModule mod_expires.c>

    ############################################
    ## Add default Expires header
    ## http://developer.yahoo.com/performance/rules.html#expires

    ExpiresDefault “access plus 1 year”

    </IfModule>

    ############################################
    ## By default allow all access

    Order allow,deny
    Allow from all

    ############################################
    ## If running in cluster environment, uncomment this
    ## http://developer.yahoo.com/performance/rules.html#etags

    #FileETag none

  • Magento SID

    如果magento base url 为 goods-pro.com,那么用www.goods-pro.com 访问时,页面中的链接会带有SID,这是为了跨域名访问时,会话不丢失。

    为了SEO,就得避免SID,为此goods-pro.com和www.goods-pro.com只能选择一个做base url,把另外一个301跳转到base url。这里我个人比较爱好no-www的方案:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

  • safe_mode

    我想用script.php访问文件系统,但又想把script.php能访问权限限制在script.php owner 的权限内(而不是apache的权限)。今天才知道把safe_mode turn on就可以,真是又高兴又痛苦,因为很久以前我就想限制script.php的访问权限了,不知道怎么,当时我得出的结论是php 以cgi模式安装才能做到权限检查,sapi模式是做不到的。可能fastcgi过分宣传它的安全特性给我造成一种错觉,其实就文件访问权限来说,sapi一样安全。

    同样也是很久以前,见论坛上有个好学的人想要一个免费的空间体验一下xoops,对于好学的人我总想热心帮忙的,况且我又不用额外支出,何乐而不为。无奈我的服务器的designer做的初始设置不是针对share hosting的,safe_mode default off。这样把服务器分给别人用我总归不放心,所以最终没有划空间给好学之士。

    safe_mode=on,真就这么简单!