Thrift-Client-Server-Example--PHP-
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:A simple, but non-trivial, PHP client-server application created to demonstrate the use of Thrift in a PHP environment.
This project was created to document the creation of a PHP client and server communicating via the Thrift framework. To better learn and illustrate the use of Thrift, I wanted to build a simple, but non-trivial, mini-application that performed tasks that might actually be useful.

This project defines a client that passes raw text to a server. The server uses the [Zemanta contextual intelligence engine](http://zemanta.com) to analyze the text for key topics and categorizations of the content. The article and its topics of interest are categorized using the [DMOZ](http://dmoz.org) and [Freebase](http://freebase.com) taxonomies. The communication between client and server, of course, happens via a Thrift interface.

# Thrift

Directly from its project site in the [Apache Incubator](http://incubator.apache.org), [Thrift](http://incubator.apache.org/thrift/):

> Thrift is a software framework for scalable cross-language services development. It combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml.

Simply stated, Thrift is an RPC framework analogous to SOAP. It offers cross-language serialization capabilities, but with significantly lower overhead because Thift uses a binary format.

While not exactly new, is still new _enough_ that documentation is scarce and difficult to piece together. You might be okay if you're interested in creating a Java or Python thrift server. Similarly, there are a number of PHP clients documented, but if you're looking to stand up a PHP-based Thrift server, you're mostly shit out of luck. Until now.

## Installing Thrift

This has been documented elsewhere so I won't belabor things here. For OS X, I used [Matt Mueller's Guide](http://mattmueller.me/blog/installing-thrift-on-snow-leopard) to install Thrift 0.4.0 and had no trouble at all.

# Project Contents

This repository contains all of the resources required to standup and test the project's functionality. In true IKEA fashion, though, some configuration is required. More on that in a bit.

* `client/`

    A PHP Thrift client specifically built to test the server implementation. This directory also includes a number of sample text files that will be analyzed randomly when the client app is loaded into a browser.

* `gen-php/`

    The PHP server and client bindings generated by Thrift (i.e. `thrift -r --gen php:server zemanta.thrift`). Additional clients for other [supported languages](http://wiki.apache.org/thrift/LanguageSupport) can be generated as needed.

* `lib/`

    The Thrift internals required to support the client and server bindings. These are created during the Thrift installation and have been copied into the project for convenience. In an enterprise solution, these would likely be linked directly from the Thrift installation directory, i.e. `/lib`. Only the PHP bindings are actually required, but the others were included in case I ever decide to play with alternate language support.

* `server/`

    The Thrift server created atop the internals and exposed via HTTP for client access.

* `zemanta.thrift`

    The Thrift interface definition file.

# Project Installation and Configuration

As mentioned above, all of the bits are in place already, but some environmental configuration is required. 

## Services

Before any of this can be wired up and operational, you'll need a [Zemanta API key](http://developer.zemanta.com/member/register). The key gives you access to [1000 API calls per day](http://developer.zemanta.com/docs) by default. No key is required to use the Freebase API. This project only reads from Freebase; reads are [throttled at 100,000 per day](http://wiki.freebase.com/wiki/API#Limits_.28Quota.29).

## Web Server

Providing detailed instructions for installing and/or configuring a web server are beyond the scope of this project. If you're here and still reading, I'm just going to assume that doing this doesn't scare the bejesus out of you and stick to the highlights of my own configuration. If your bejesus is firmly intact, you'll understand how to tailor these instructions to match your own environment.

I run a local Apache server on OS X with named virtual hosts turned on. I have one host pointing to the `client/` directory and another pointing to the `server/` directory. For convenience, I added `DirectoryIndex` directives for `client.php` and `server.php`, respectively.

    # 
    # SERVER
    # 
    
      ServerName     thrift.php.server.local
      ServerAlias    thrift.php.server thrift.php.server.dev thrift.php.server.dev.local
      DocumentRoot   /var/www/thrift-example/server
      DirectoryIndex server.php
      
      ErrorLog     /var/www/.logs/thrift.php.server/error_log
      CustomLog    /var/www/.logs/thrift.php.server/access_log common
    
      
        Options FollowSymLinks Indexes
        AllowOverride None
        Order deny,allow
        Allow from all
      
    
    
    # 
    # CLIENT
    # 
    
    	ServerName     thrift.php.client.local
    	ServerAlias    thrift.php.client thrift.php.client.dev thrift.php.client.dev.local 
    	DocumentRoot   /var/www/thrift-example/client
    	DirectoryIndex client.php
    
    	ErrorLog     /var/www/.logs/thrift.php.client/error_log
    	CustomLog    /var/www/.logs/thrift.php.client/access_log common
    
    	
              Options FollowSymLinks Indexes
              AllowOverride None
              Order deny,allow
              Allow from all
    	
    
    

## Server & Client

Configuring the server and client is as simple as copying the `config.sample.php` file in each to `config.php` and updating the values appropriately.

The server requires one additional change. You'll have to copy `zemanta_service.sample.php` to `zemanta_service.php` and update the `API_KEY` class constant to the value of your Zemanta key:

    const API_KEY = 'YOUR_ZEMANTA_API_KEY_HERE';

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。