C # sınıfına PHP sınıfı?

5 Cevap

I work for a company that makes application's in C#. recently we got a customer asking us to look in to rebuilding an application written in PHP. This application receives GPS data from car mounted boxes and processes that into workable information.

GPS cihazı için üretici alınan bilgiyi ayrıştırır ve koordinatları ayıklayan bir PHP sınıfı vardır. Biz bunu kullanmak ve uyum sağlayabilen bir C # sınıf PHP sınıfını yeniden için aradılar. Ve burada bu üreticilerin web sitesinde benim deri krawling var bir metin singel çizgi vardır, gelir:

"The encoding format and contents of the transmitted data are subject to constant changes. This is caused by implementations of additional features by new module firmware versions which makes it virtually impossible to document it and for you to properly decode it yourself."

Yani ben şimdi "sürekli değişen" PHP sınıfını kullanın ve C # erişmek için bir seçenek arıyorum. Bazı şey sadece bazı fonksiyon en i need açığa bir kabuk bağlar. I bunu nasıl hiçbir fikrim yok dışında. Herhangi biri bana bunun için bir çözüm bulmanıza yardımcı olabilir.

5 Cevap

Eğer php komutu gerekir demektir rağmen, ben bu gerçekten hacky çözüm biliyorum, ama sen C # her zaman tekrar tekrar bağlantı noktasına sahip istemiyorum PHP kod biraz gerekiyorsa, aşağıdaki yaklaşım deneyebilirsiniz hedef makinede satırı aracı.

İlk adım sürekli, stdin kapalı verileri okur satıcıdan bu özel sınıf kullanarak çözer ve stdout dışarı sonucu yazar bir php komut dosyası sahip olmaktır. Gerçekten basit bir örnek:

<?php

include("VendorDecodingClass.php");

while(true) 
{
    $input = fgets(STDIN); //read off of the stdin stream

    //can't remember if this is valid, but somehow check that there is some data
    if($input) 
    {
         //pass it off to the vendor decoding class
         $output = VendorDecoding::decode($input);    

         fwrite(STDOUT, $output); //write the results back out
    }
    //sleep here so you don't suck up CPU like crazy 
    //(1 second may be a bit long tho, may want usleep)
    //Edit: From Tom Haigh, fgets will block, so the sleep isn't necessary
    //sleep(1); 
}

?>

Neyse, size bir sonraki noktada stdin ve stdout başvuruda böylece yerde, C # uygulama, sağ başında, bu komut dosyasını çalıştırmak ve sonra bir yerde Süreci örneğini kaydetmek için yeni Süreci oluşturmak var bir kere. Örnek:

ProcessStartInfo procStartInfo = new ProcessStartInfo("php", "yourscript.php");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;

Process proc = new Process(); //store this variable somewhere
proc.StartInfo = procStartInfo;
proc.Start();

Verilerinizi çözmek istiyorsanız o zaman, sadece oluşturduğunuz php sürecinin stdin yazmak ve stdout'ta bir yanıt bekleyin. Bu süreci oluşturma havai fark olabilir çünkü stdin / stdout yaklaşımı kullanarak, yeni bir süreç bazı verileri çözmek istediğiniz her zaman yaratmak çok daha verimli.

proc.StandardInput.WriteLine(somedata); //somedata is whatever you want to decode

//may need to wait here, or perhaps catch an exception on the next line?

String result = proc.StandardOutput.ReadLine();

//now result should contain the result of the decoding process

Burada Yasal Uyarı, bu kod herhangi bir test değil, ama ben bunu nasıl genel özü olduğunu.

Ben sadece düşündüm başka bir şey, o PHP süreci sona erdirmek için bazı mekanizmalar isteyeceksiniz. Bu Process.Kill kullanmak için Tamam olabilir, ama çözme herhangi bir dosya IO, ya da bir şekilde php script bir kesme sinyali göndermek isteyebilirsiniz kritik bir şey yaparsa. Olabilir

Ben bu denedim hiç vardır ve kimse bilmiyorum, ama ben önce bu bazen genelinde geliyorsun hatırlıyorum ve ben sizin için olası bir seçenek olarak oraya atmak düşündüm.

Phalanger IL PHP kodu derler bir derleyici proje, böylece doğrudan sizin kod referans Yönetilen bir derleme var o kullanabilirsiniz.

Biçiminde bir uygulama ayar dosyasına koymak için deneyebilirsiniz bir regex ise (kaynak değil, bunlar app derlemeye olmadan bunları değiştiremezsiniz, uygulama İLE derlenmiş).

Uygulama ayarları kullanıcı tarafından değiştirilebilir değil ama XML düzenleyerek yapabilirsiniz.

Yoksa kullanıcı moduna ayarlarını yapabilirsiniz ve daha sonra uygulama kodunuz içindeki biçimini değiştirebilirsiniz.

Neden sadece bir dosyaya sonuçları çıkış var, C # PHP komut dosyası başlatmak ve ardından C # programı için girdi olarak bu dosyayı kullanmak değil mi?

Şahsen, ben kurulum C # proje, erişim web hizmeti üreticileri verilen PHP sınıfı uygulamak ve olması sağlayabilirsiniz uygun ve istikrarlı bir API ile bir PHP web hizmeti olur.