АРХИВ ПО ТЭГУ "PHP"
АВГУСТ 9, 2011

Hola.

Как делишки!

Простейший пример реализации SOAP Contract-First сервера на PHP.

Архив исходника качать тут.

WSDL

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <wsdl:definitions name="sserver"
  3.    targetNamespace="http://mycom.com/wsdl/"
  4.    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  5.    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  6.    xmlns:tns="http://mycom.com/wsdl/"
  7.    xmlns:my-xsd="http://mycom.com/types/"
  8.    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  9.  
  10.    <wsdl:types>
  11.       <xsd:schema elementFormDefault="qualified"
  12.                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  13.                         targetNamespace="http://mycom.com/types/">
  14.  
  15.          <xsd:element name="MyResult" type="my-xsd:MyResult"/>
  16.          <xsd:complexType name="MyResult">
  17.             <xsd:sequence>
  18.                <xsd:element name="OutputStr" type="xsd:string" minOccurs="0" maxOccurs="1"/>
  19.             </xsd:sequence>
  20.          </xsd:complexType>
  21.           </xsd:schema>
  22.         </wsdl:types>
  23.  
  24.    <wsdl:message name="testSrvRequest">
  25.    </wsdl:message>
  26.    
  27.    <wsdl:message name="testSrvResponse">
  28.          <wsdl:part name="MyResult" element="my-xsd:MyResult"/>
  29.    </wsdl:message>
  30.    
  31.    <wsdl:portType name="Srv_PortType">
  32.       <wsdl:operation name="testSrv">
  33.          <wsdl:input message="tns:testSrvRequest" />
  34.          <wsdl:output message="tns:testSrvResponse"/>
  35.       </wsdl:operation>
  36.    </wsdl:portType>
  37.    
  38.    <wsdl:binding name="Srv_Binding" type="tns:Srv_PortType">
  39.       <soap:binding style="document"  transport="http://schemas.xmlsoap.org/soap/http"/>
  40.       <wsdl:operation name="testSrv">
  41.          <soap:operation soapAction=""/>
  42.          <wsdl:input>
  43.             <soap:body use="literal" />
  44.          </wsdl:input>
  45.          <wsdl:output>
  46.             <soap:body use="literal" />
  47.          </wsdl:output>
  48.       </wsdl:operation>
  49.    </wsdl:binding>
  50.  
  51.    <wsdl:service name="testService">
  52.       <wsdl:documentation>WSDL File for Test Server side</wsdl:documentation>
  53.       <wsdl:port binding="tns:Srv_Binding" name="Srv_Port">
  54.          <soap:address
  55.             location="http://localhost/1.php" />
  56.       </wsdl:port>
  57.    </wsdl:service>
  58. </wsdl:definitions>

Сервер

  1. class MyServer {
  2.  
  3.         public function testSrv() {
  4.                 return array('OutputStr' => "Ololo testeg result");
  5.         }
  6. }
  7.  
  8. $wsdlFile = "file:///tmp/tmp.wsdl";
  9.  
  10. $srv = new SoapServer($wsdlFile);
  11. $srv->setObject(new MyServer());
  12. $srv->handle();

Клиент

  1. // Send through SOAP
  2. try {
  3.         $cln = new SoapClient("file:///tmp/tmp.wsdl");
  4.         $resp = $cln->testSrv();
  5.         echo "\nDetailed response: " . print_r($resp, true) . "\n";
  6. } catch (\Exception $e) {
  7.         echo "ERROR Unknown:" . $e->getMessage();
  8. }
  9.  
  10. echo "\n";
ИЮЛЬ 16, 2011

Хаи.

Обожаю гугл.

30 минутный php скрипт, который грабит исторические данные с Google Financial по всем стакам в период с 1 января 1995 по 1 июля 2011 и сохраняет в CSV файлики вида <CUR_DIR>/<MarketName>/<Ticker>.csv

Внутри данные OCHL + Volume.

Я его правда еще не запускал на CID до 30к, но думаю там должно в итоге получиться не мало стаков.

date_default_timezone_set('UTC');
  1.  
  2. define('GRABBER_PATH', dirname(__FILE__));
  3.  
  4. // Jan-1-1995 up to Jul-1-2011
  5. $url = 'http://www.google.com/finance/historical?cid=!CID!&startdate=Jan+1%2C+1995&enddate=Jul+1%2C+2011&num=30';
  6. $exportUrlPostfix = '&output=csv';
  7.  
  8. // The easiest way
  9. $pattern = '/\<title\>;([^:]+): ([\w+]+):([\w\d]+) historical price/';
  10.  
  11. // CID up to 30k 'cause not every cid is an existings stock icon sad Исторические данные акций NYSE и NASDAQ (дневные) %d1%82%d1%80%d0%b5%d0%b9%d0%b4%d0%b8%d0%bd%d0%b3 %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8
  12. $cidStart = 1;
  13. $cidEnd = 30000;
  14.  
  15. for ($cid = $cidStart; $cid < $cidEnd; $cid++) {
  16.         $curUrl = str_replace('!CID!', $cid, $url);
  17.  
  18.         $pageHtml = @file_get_contents($curUrl, false, null, 0, 1000);
  19.         if (empty($pageHtml)) {
  20.                 continue;
  21.         }
  22.  
  23.         if (!preg_match($pattern, $pageHtml, $matches)) {
  24.                 continue;
  25.         }
  26.  
  27.         $companyName = $matches[1];
  28.         $market = $matches[2];
  29.         $ticker = $matches[3];
  30.  
  31.         echo "[CID=$cid] Found: $companyName ($market:$ticker)\n";
  32.  
  33.         if (!file_exists(GRABBER_PATH . '/' . $market)) {
  34.                 mkdir(GRABBER_PATH . '/' . $market);
  35.         }
  36.  
  37.         if (!is_dir(GRABBER_PATH . '/' . $market)) {
  38.                 echo " * ERR: " . GRABBER_PATH . '/' . $market . " is not dir\n";
  39.                 continue;
  40.         }
  41.  
  42.         $downloadUrl = $curUrl . $exportUrlPostfix;
  43.         $csvData = @file_get_contents($downloadUrl);
  44.         if (empty($csvData)) {
  45.                 echo " * ERR: Cannot grab data from $downloadUrl\n";
  46.                 continue;
  47.         }
  48.  
  49.         $csvFile = GRABBER_PATH . '/' . $market . '/' . $ticker . '.csv';
  50.         if (!file_put_contents($csvFile, $csvData)) {
  51.                 echo " * ERR: Cannot save CSV data to $csvFile\n";
  52.                 continue;
  53.         }
  54. }

ИЮНЬ 27, 2011

Хаи.

Не знаю, на первой странице гугла не нашел я хелпера или плагина PrettyTime для зенда (Zend Framework), так что пришлось за полчасика свой наговнякать.

  1.  
  2. class Default_View_Helper_PrettyTime extends Zend_View_Helper_Abstract {
  3.  
  4.  const MINUTE = 60;
  5.  const HOUR = 3600;
  6.  const DAY = 86400;
  7.  const WEEK = 604800;
  8.  const MONTH = 2592000;
  9.  const YEAR = 31536000;
  10.  
  11.  public function prettyTime($time) {
  12.   $curTime = time();
  13.   $delta = $curTime - $time;
  14.  
  15.   if ($delta < self::MINUTE) {
  16.    $text = $this—>view-&gt;translate("moments ago");
  17.   } else if ($delta &lt; self::HOUR) {
  18.    //minutes
  19.    $d = (int) ceil($delta / self::MINUTE);
  20.  
  21.    if ($d == 1) {
  22.     $text = "$d " . $this-&gt;view-&gt;translate("minutes ago 1");
  23.    } else if ($this-&gt;_is234($d)) {
  24.     $text = "$d " . $this-&gt;view-&gt;translate("minutes ago 234");
  25.    } else {
  26.     $text = "$d " . $this-&gt;view-&gt;translate("minutes ago");
  27.    }
  28.   } else if ($delta &lt; self::DAY) {
  29.    //hours
  30.    $d = (int) ceil($delta / self::HOUR);
  31.  
  32.    if ($d == 1) {
  33.     $text = "$d " . $this-&gt;view-&gt;translate("hours ago 1");
  34.    } else if ($this-&gt;_is234($d)) {
  35.     $text = "$d " . $this-&gt;view-&gt;translate("hours ago 234");
  36.    } else {
  37.     $text = "$d " . $this-&gt;view-&gt;translate("hours ago");
  38.    }
  39.   } else if ($delta &lt; self::WEEK) {
  40.    //days
  41.    $d = (int) ceil($delta / self::DAY);
  42.  
  43.    if ($d == 1) {
  44.     $text = "$d " . $this-&gt;view-&gt;translate("days ago 1");
  45.    } else if ($this-&gt;_is234($d)) {
  46.     $text = "$d " . $this-&gt;view-&gt;translate("days ago 234");
  47.    } else {
  48.     $text = "$d " . $this-&gt;view-&gt;translate("days ago");
  49.    }
  50.   } else if ($delta &lt; self::YEAR) {
  51.    //weeks
  52.    $d = (int) ceil($delta / self::WEEK);
  53.  
  54.    if ($d == 1) {
  55.     $text = "$d " . $this-&gt;view-&gt;translate("weeks ago 1");
  56.    } else if ($this-&gt;_is234($d)) {
  57.     $text = "$d " . $this-&gt;view-&gt;translate("weeks ago 234");
  58.    } else {
  59.     $text = "$d " . $this-&gt;view-&gt;translate("weeks ago");
  60.    }
  61.   } else {
  62.    // years
  63.    $d = (int) ceil($delta / self::YEAR);
  64.  
  65.    if ($d == 1) {
  66.     $text = "$d " . $this-&gt;view-&gt;translate("years ago 1");
  67.    } else if ($this-&gt;_is234($d)) {
  68.     $text = "$d " . $this-&gt;view-&gt;translate("years ago 234");
  69.    } else {
  70.     $text = "$d " . $this-&gt;view-&gt;translate("years ago");
  71.    }
  72.   }
  73.  
  74.   return $text;
  75.  }
  76.  
  77.  private function _is234($d) {
  78.   if ($d == 2 || $d == 3 || $d == 4 || (($d % 100) &gt; 20 &amp;&amp; (($d % 10) == 2 || ($d % 10) == 3 || ($d % 10) == 4))) {
  79.    return true;
  80.   }
  81.   return false;
  82.  }
  83. }
ИЮНЬ 27, 2011

logo SavesShare   Шарилка сейвов %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news %d0%b8%d0%b3%d1%80%d1%8b

Хаи.

Я недавно начал в четвертый раз проходить финалку 7 (Final Fantasy 7), потому что старый сейвов у меня как бы нема к сожалению.

Но как же запарно сто раз одно и то же гонять (хотя это все так же захватывает). Вобщем решил я написать сайто — шарилку сейвов игр всяких.

Говнякал я эту хрень неделю, и вот сейчас я заливаю на сервак, правда пора уже облачный сервер покупать, а то sweb лажает.

Итак, представляю вашему вниманию мой новый проект (на старом домене) — Сейвгеймы!

Старая хрень находится теперь тут.

ИЮНЬ 22, 2011

zend framework logo php I18N in Zend %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hi.

Простецкая локализация всякого говнеца в зенде (Zend Framework) без кэша.

В бутстрапе втыкаем такое:

function _initTranslator() {
  1.   //
  2.   // Locale default (use session)
  3.   $sess = new Zend_Session_Namespace('session');
  4.   $lang = isset($sess-&gt;lang) ? $sess-&gt;lang : new Zend_Locale('ru');
  5.   Zend_Registry::set('Zend_Locale', $lang);
  6.  
  7.   //
  8.   // Translator
  9.   $translator = new Zend_Translate(array(
  10.     'adapter' =&gt; Zend_Translate::AN_INI,
  11.     'content' =&gt; APPLICATION_PATH . '/../files/trans/ru.ini',
  12.     'locale' =&gt; 'ru',
  13.   ));
  14.   $translator-&gt;addTranslation(APPLICATION_PATH . '/../files/trans/en.ini', 'en');
  15.   $translator-&gt;setLocale($lang-&gt;toString());
  16.  
  17.   // Set translator
  18.   Zend_Registry::set('Zend_Translate', $translator);
  19.   Zend_Form::setDefaultTranslator($translator);
  20.  }

Ну а уж переключение локалей в сессии все сами наговнякают.

Сия

ИЮНЬ 10, 2011

php fast logger myltik Быстрый PHP логгер %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hi.

Какой логгер юзать в PHP? Кнешно же  log4php — охеренчик, много настроек всяких, разных аппендеров, но есть одна проблемка — жуткий перформанс, это очень хорошо заметно в хайл лоад проектах. Вобщем чтоб поиметь быстрый логгер на PHP нужно написать свой кастомный, для своих конкретных нужд, и уж точно не юзать сторонние хрени типа.

К примеру: мой самописный простой логгер увеличил перворманс проекта («ab -c 10″) в два раза. По идее логгер даже можно ускорить если хранить кэш лога в мемкэше например и флашать его на диск раз в несколько секунд — правда я не знаю будет ли это быстрее, если кто то попробует — дайте мне знать icon smile Быстрый PHP логгер %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Бабай!

Страницы:12