淫荡一下,你就知道

这是一个很YY的应用,说他YY他就YY,说他XX他就XX.

你可以diy自己的搜索引擎,设置为主页,真正属于你自己的搜索主页。

下图是示例:

订制你自己的搜索主页,现在就开始吧!

究竟什么是TSRMLS_CC?

翻译:54chen.com
原文地址:http://blog.libssh2.org/index.php?/archives/22-What-the-heck-is-TSRMLS_CC-anyway.html

如果你曾经做过php内核或者是php扩展方面的工作,你一定见到过这个到处都是的结构,但是却从来没有人提起过它。知道这是什么的人典型回答不知道的人都会这样说:“不用管它是什么,只需要在这里、这里还有这里用,如果编译器说少一个tsrm_ls,就加一个...”。这样回答并非都是因为这个人懒惰(的确是有一点点懒),其实那只是在说引擎甚至可以不管这个神奇的值在简化什么,这是因为一个新入门的扩展开发者知道它的结构没有什么益处。这信息就像奶牛的意见一样,没关系,就是牛叫而已。

既然我喜欢听自己喋喋不休的无意义主题(这个月我已经少写很多博客了),我想我得弥补这一主题,看看会不会有人通过他能领会什么。你可以责怪Lukas(Lukas Smith 是 PEAR DB 的主要作者应该是这个Lukas,译者注),他让我一直在planet-php.net上。

术语

TSRM

Thread Safe Resource Manager - 这是一个经常被忽视的层面,就会有也是很少被讨论到,在你的PHP源代码包中,它被隐藏在/TSRM目录中。默认情况下,TSRM 层只在编译需要它的SAPI的时候才会打开(例如apache2-worker)。所有的在win32下编译的SAPI都会有TSRM层而不会管它们是否需要。

ZTS

Zend Thread Ssafety -通常情况下,与TSRM有相同的用处。具体来说不同在于,ZTS的使用需要在编译的时候加上参数如./configure ( --enable-experimental-zts for PHP4, --enable-maintainer-zts for PHP5),而TSRM是否被使用是由#define的预处理机制来确定的。

tsrm_ls

TSRM local storage - 当ZTS可用时,这是它在TSRMLS_*宏里传来传去的实际的变量名。它作为一个指向那个线程的独立数据存储块开始位置的指针,我会在一会儿后将它覆盖掉。

TSRMLS_??

有四个宏设计来为了使ZTS模式和非ZTS模式之间的差异变得平滑,当ZTS不能用时,这四个宏同时都没有任何用处。而在ZTS启用的时候,它们扩大了以下的定义:

  • TSRMLS_C   tsrm_ls
  • TSRMLS_D   void ***tsrm_ls
  • TSRMLS_CC  , tsrm_ls
  • TSRMLS_DC  , void ***tsrm_ls
  • 综述

    在任何普通的C程序(PHP也一样)中,要在两个不同的函数间传递相同的数据块,你两种办法。

    第一种方法是通过函数的参数传递值:

    #include <stdio.h>

    void output_func(char *message)
    { printf("%s\n", message);
    }

    int main(int argc, char *argv[])
    { output_func(argv[0]);

    return 0;
    }

    另一种方法,你可以把这个值保存在一个上层的全局变量中,让函数通过它来取得:
    #include <stdio.h>

    char *message;

    void output_func(void)
    { printf("%s\n", message);
    }

    int main(int argv, char *argv[])
    { message = argv[0];
    output_func();

    return 0;
    } 这两种方法各有优点和缺点,而且在在实际应用中你常常会看到两者结合使用。事实上,PHP里到处都是全局变量,从类型标识符,到函数回调指针,再到请求特殊的信息例如用于存储用户空间变量的符号表。试图通过函数参数的方法来传递那些变量是不方便的,例如PHP这样的应用常常会需要去注册回调方法来给不支持上下文数据的外部的库使用,此时使用参数传递是不可能的。

    因此,共同的信息,像执行栈、函数表、类表以及扩展登记表都是在全局范围里进行声明的,以便它们能在整个应用的任何一个位置都能使用。对于单线程的SAPIs,例如CLI、APACHE1,或者甚至Apache2-prefork,这样做都是完美的。在RINIT/Activation 阶段,请求具体结构被初始化,并在RSHUTDOWN/Deactivation 阶段重新设置回初始的值等待下一次的请求。一个像APACHE1这样特定的WEB服务器,可以一次处理多个页面,是因为它会产生多个进程,每个进程会在自己的进程空间内使用自己的全局变量副本。

    现在,让我们来介绍像Apache2-worker或者IIS这样的线程服务器。在这种情况下,在指定时间里只有一个进程空间是可用的,由它抛出多线程处理。每一个线程都会类似一个单独的进程的方式工作。在处理请求的时候服务会一次一个地来。当两个或者多个线程去处理同一时间的一个请求的时候,麻烦就出现了。每个线程都试图去使用全局变量来保存它的特定请求信息,并尝试写向同样的存储空间。这样子最少会导致一个脚本里声明的用户空间变量在另一个脚本中出现。而在实践中,这样会导致快速灾难性的错误和不可预测的情况,因为内存可以释放两次或者独立的线程写了相互矛盾的信息。

    不全的全局

    解决方案需要一个引擎、一个核心,还有任何一个使用全局存储的扩展都要决定会使用多少内存给具体的请求数据。然后,在运行的每一个新的线程中,给它们每个分配一块内存,用来存储它们的数据,从而使每个线程都有自己的本地存储。为了把所有的被指定线程用到的内存块聚成一组,最后一个指针向量被开辟来保存子结构的指针。这个指针指向tsrm_ls变量,被TSRMLS_*家族的宏所使用。为了看清它是怎么工作的,我们先来看一个扩展的例子:

    typedef struct _zend_myextension_globals {
        int foo;
        char *bar;
    } zend_myextension_globals;

    #ifdef ZTS
    int myextension_globals_id;
    #else
    zend_myextension_globals myextension_globals;
    #endif

    /* Triggered at the beginning of a thread */
    static void php_myextension_globals_ctor(zend_myextension_globals *myext_globals TSRMLS_DC)
    { myext_globals->foo = 0;
    myext_globals->bar = NULL;
    }

    /* Triggered at the end of a thread */
    static void php_myextension_globals_dtor(zend_myextension_globals *myext_globals TSRMLS_DC)
    { if (myext_globals->bar) {
    efree(myext_globals->bar);
    }
    }

    PHP_MINIT_FUNCTION(myextension)
    { #ifdef ZTS
    ts_allocate_id(&myextension_globals_id, sizeof(zend_myextension_globals),
    php_myextension_globals_ctor, php_myextension_globals_dtor);
    #else
    php_myextension_globals_ctor(&myextension_globals TSRMLS_CC);
    #endif

    return SUCCESS;
    }

    PHP_MSHUTDOWN_FUNCTION(myextension)
    { #ifndef ZTS
    php_myextension_globals_dtor(&myextension_globals TSRMLS_CC);
    #endif

    return SUCCESS;
    } 这里可以看到,扩展在启动的时候声明了它全局需求的变量给TSRM层,它需要sizeof(zend_myextension_globals)字节的存储,并且在初始化或者销毁指定的线程的本地存储的时候提供了回调函数。myextension_globals_id里的值可得出偏移量(对所有线程是公共的),存储于tsrm_ls向量,指向那个线程本地存储的指针中也是这个向量。如果ZTS不能用,数据存储只不过是放在真实的全局环境中,并且在线程初始和销毁的过程中需要手动执行初始化和销毁的程序。如果你现在想知道为什么TSRMLS_CC 被包含在非ZTS块中,那我可以很确定我没有使你看睡着了。这些都是不是必须的,因为我们知道非ZTS里他们有和没有一个样,但这有助于鼓励函数原型调用时引用它们的好习惯。

    把它们聚在一起

    最后一块线程安全的疑惑来自于一个问题:“我如何获得这些数据结构?”这个问题的答案来自于另一个有着相似样子的宏。在每个扩展或者是核心组件定义的头文件中,有一个宏的定义如下所示:

    #ifdef ZTS
    # define   MYEXTENSION_G(v)     \
                 (((zend_myextension_globals*)(*((void ***)tsrm_ls))[(myextension_globals_id)-1])->v)
    #else
    # define   MYEXTENSION_G(v)     (myextension_globals.v)
    #endif
    因此,当ZTS不可用时,这个宏简单地收集来自全局环境中的即时值作用正确的值,否则,它将根据ID将结构开辟在本线程的本地存储拷贝中,并且从那里引用到值。

    【结束:54chen.com】

    Sscanf函数的各种用法

    sscanf是一个运行时函数,原形很简单: 
    int sscanf( 
    const char *buffer, 
    const char *format [, 
    argument ] ... 
    ); 
    它强大的功能体现在对format的支持上。 

    sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 

        char str[512] = ; 
      sscanf("123456 ", "%s", str); 
      printf("str=%s", str);
    输出 str=123456
        sscanf("123456 ", "%4s", str); 
      printf("str=%s", str);
    输出 str = 1234
      sscanf("123456 abcdedf", "%[^ ]", str); 
      printf("str=%s", str);
    输出 str=123456 (遇到空格为止)
      sscanf("123456abcdedfBCDEF", "%[^A-Z]", str); 
      printf("str=%s", str);
    输出 str=123456abcdef (遇到指定字符为止)
    sscanf(mod, "%s", mod);//去除空格

    著名网站架构设计

  • WikiPedia 技术架构学习分享
  • YouTube 的架构扩展
  • Internet Archive 的海量存储浅析
  • LinkedIn 架构笔记
  • Tailrank 网站架构
  • Twitter 的架构扩展: 100 倍性能提升
  • 财帮子(caibangzi.com)网站架构
  • Yupoo! 的网站技术架构
  • 37Signals 架构
  • Flickr 的访问统计实现以及其他
  • PlentyOfFish 网站架构学习
  • Yahoo!社区架构
  • 有关 Alexa 与 AOL 部署集群文件系统
  • eBay 的存储一瞥
  • eBay 的数据量
  • eBay 的数据库分布扩展架构
  • eBay 的数据层扩展经验
  • eBay 的应用服务器规模
  • 性能扩展问题要趁早
  • Scaling an early stage startup
  • Facebook 的 PHP 性能与扩展性
  • Skype 用 PostgreSQL 支撑海量用户
  • 闲谈 Web 图片服务器
  • 说说北京奥运购票系统瘫痪这事儿
  • Architectures You’ve Always Wondered About
  • eBay’s Architectural Principles
  • Building a large scale SaaS app
  • Scaling an early stage startup
  • 互联星空播客架构(原文在张宴blog上,但是后来文章撤下,很可惜.此为转载)
  • QQ游戏百万人同时在线服务器架构实现
  • 大型Web2.0站点构建技术初探
  • Web站点数据库分布存储浅谈
  • QQ的架构讨论
  • Notes from Scaling MySQL - Up or Out
  • Yapache-Yahoo! Apache 的秘密
  • LinkedIn 架构与开发过程
  • Scalability Best Practices: Lessons from eBay
  • 看 Twitter 人谈架构扩展问题
  • Facebook 海量数据处理
  • web 2.0海量小文件cache集群探讨
  • Cocolog 从 PostgreSQL 迁移到 MySQL 的经验
  • 疯狂代码:大型网站架构系列(未完待续)收藏
  • Amazon Architecture
  • Scaling Twitter
  • 37signals Architecture
  • Digg Architecture
  • Flickr Architecture
  • YouTube Architecture
  • Google Architecture
  • LiveJournal’s Backend
  • LiveJournal Architecture
  • eBay Architecture
  • PHP代码的优与劣

    原文作者:Kevin Yank

    原文链接:Good and Bad PHP Code      

          我在SitePoint做面试官的时候一定会问的问题是:你认为PHP代码的优劣体现在哪里?因为这个问题可以让我大体知道应聘者是哪种类型的程序员,而不是单纯地考察他对PHP函数的掌握程度(这一点Zend的PHP认证做得不错,雅虎的PHP程序员面试题也属于此类)。

      重要的是,这个问题可以让我知道应聘者是否经历过这样的事情——从一个懒散程序员手中接过一段凌乱的代码进行重用,或者要帮助团队中的其他成员来处理这类事情。

      诚然,对于这个问题我自己并没有一个满意的答案,不过我知道哪些答案是我想听到的:

      优良的PHP代码应该是结构化的。大段的代码应该被分割整理成一个个函数或方法,而那些不气眼的小段代码则应该加上注释,以便日后清楚它们的用途。而且应该尽可能地把前台代码如HTML、CSS、Javascript等从程序中分离出来。PHP的面向对象编程特性可以很好地帮助程序员将代码整理有序。

      优良的PHP代码应该是规范化的。无论是为变量名和函数名设定命名规则,还是对一些会重复使用的过程如数据库操作和错误处理进行标准化,抑或是简单到规定好代码是怎样缩进的,这些规范化都可以让代码的可读性大大提高。

      优良的PHP代码应该是自适应的。PHP有许多特性如magic quotes和short tags,这些特性的打开和关闭会影响到程序的运行。所以,一个好的程序员应该在他的代码中加如适当的语句来使程序能够根据环境进行调整。

      优良的PHP代码应该是安全的。虽然PHP是一种高效、灵活的语言,没有固定的框架,但却把安全问题留给了程序员们。对潜在安全漏洞的深刻理解,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、代码注入漏洞、字符编码循环漏洞等,对于今天的专业程序员来说是至关重要的。

      当应聘者在回答这些问题的时候,我就能清楚地知道是否该录用他。当然,有时程序员并不能很好地阐明这个问题,这时我们会让他们做一些PHP测试。测试中的许多问题表面上看起来非常简单,但这也给了应聘者们一个展现自我的机会,因为只要观察得仔细,就能找出问题。

      下面这一小段“劣质”的PHP代码是一道简化了的测试题。这种问题就像在问:你该怎样优化这段代码?

    <?
    echo("<p>Search results for query: " .
        $_GET['query'] . ".</p>");
    ?>

      这段代码的主要问题在于它把用户提交的数据直接显示到了网页上,从而产生XSS漏洞。其实有很多方法可以填补这个漏洞。那么,什么代码是我们想要的呢?

    <?
    echo("<p>Search results for query: " .
        htmlspecialchars($_GET['query']) . ".</p>");
    ?>

      这是最低要求。XSS漏洞用htmlspecialchars函数填补了,从而屏蔽了非法字符。

    <?php   
    if (isset($_GET['query']))   
    {   
      echo '<p>Search results for query: ',   
          htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>';   
    }   
    ?> 

      能写出这样代码的人应该是我想要录用的人了。

    • <?被替换成了<?php,这样更符合XML规范。
    • 在输出$_GET['query']的值之前先判断它是否为空。
    • echo命令中多余的括号被去掉了。
    • 字符串用单引号限定,从而节省了PHP从字符串中搜索可替换的变量的时间。
    • 用逗号代替句号,节省了echo的时间。
    • 将ENT_QUOTES标识传递给htmlspecialchars函数,从而保证单引号也会被转义。虽然这并是最主要的,但也算是一个良好习惯。
      可惜的是,能给出这样让人满意答复的程序员少之又少。我们花了3个月的时间才招聘到让我们满意的程序员。

      那么,你会怎样回答文章开头提出的问题呢?你认为PHP代码的优劣体现在哪里?你认为一个PHP程序员还应具有哪些品质?

    Web压力测试工具介绍

    1.http_load

    下载地址:http://www.acme.com/software/http_load/

    实际运行:

    bash# http_load -rate 5 -seconds 10 urls

    • -parallel 简写-p :含义是并发的用户进程数。
    • -fetches 简写-f :含义是总计的访问次数
    • -rate 简写-r :含义是每秒的访问频率
    • -seconds简写-s :含义是总计的访问时间
    • urls.txt 是一个url 列表,每个url 单独的一行;不可以直接跟一个url,有些博客主说的可以跟一个url是错误的说法。
    49 fetches, 2 max parallel, 289880 bytes, in 10.0145 seconds
    5916 mean bytes/connection
    4.89274 fetches/sec, 28945.1 bytes/sec
    msecs/connect: 28.8932 mean, 44.243 max, 24.488 min
    msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    HTTP response codes:
    code 200 -- 49
    解释:
    • 49 fetches, 2 max parallel, 289880 bytes, in 10.0145 seconds
    • 说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289880bytes,运行的时间是10.0145秒
    • 5916 mean bytes/connection
    • 说明每一连接平均传输的数据量289880/49=5916
    • 4.89274 fetches/sec, 28945.1 bytes/sec
    • 说明每秒的响应请求为4.89274,每秒传递的数据为28945.1 bytes/sec
    • msecs/connect: 28.8932 mean, 44.243 max, 24.488 min
    • 说明每连接的平均响应时间是28.8932 msecs,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs
    • msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    • HTTP response codes: code 200 — 49
    • 说明打开响应页面的类型,如果403的类型过多,那可能要注意是否系统遇到了瓶颈。
    • 一般会关注到的指标是fetches/sec、msecs/connect,它们分别对应的常用性能指标参数QPS-每秒响应用户数和response time,每连接响应用户时间。测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的cpu、men进行分析,才能得出结论;
    • 如果要测试HTTPS,需要在编译前指定Makefile中 SSL_TREE 的路径:一般为 /usr 或/usr/local 。
     

    2.ab

    ab -n 1000 -c 50 http://www.domain.com/test.php
    ab将同时向http://www.domain.com/test.php发出50个并发请求,共发出1000次。
    有用的信息:
    Requests per second:    75.45 [#/sec] (mean)
    每秒钟可以处理的请求数为75.45个
    • 若将请求数增加,看看服务器能否处理更大的压力,需要调节Apache的 MaxClients、ThreadsPerChild、MaxThreadsPerChild 等参数,基于httpd.conf中的MPM模块选择。
    • 若本地服务器不是Apache,请使用其它测试方法。

    Md5在线破解 MD5 Crack

    本站400PB硬盘已经上线,共有md5记录约40P(1P=1000*1000*1000*1000*1000)条,宇宙第一,且还在不断增长中,包括所有组合,本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。全国独此一家。另感谢cnflex的同志们提供这么好的idea,感谢瓜瓜未来的试用手记,无形中使得大大提高了命中率!