Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    PHP si disconnette da web service

    ciao!

    ho un web service di tipo REST scritto in java, che estrai i dati da un db e li manda in formato JSON.
    in alcuni casi il JSON è arrivato a pesare anche 5MB.
    sul browser vedo bene i dati, anche se in questi casi non è proprio velocissimo.
    ma se provo da PHP ottengo una eccezione in Java, che da quanto ho capito corrisponde alla disconnessione di PHP.

    con PHP faccio questo:
    Codice PHP:
        $url 'http://web_service/dati/';
        
    $result file_get_contents($url);
        
    $json json_decode($resulttrue);
        foreach (
    $json as $v) {
            
    // ELABORA
        

    come posso evitare la disconnessione da PHP?
    su quali parametri dovrei agire?

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Quale sarebbe l'eccezione lanciata da Java?

    Hai già pensato ad un timeout?

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    la file_get_contents dovrebbe avere un timeout definito nel php.ini (default_socket_timeout) che di default è di 60 secondi.
    Potresti crearti uno stream context ed impostare un timeout maggiore:

    Codice PHP:
    $stream_context stream_context_create(array('http'=>
        array(
            
    'timeout' => 120  // 2 Minuti
        
    )
    ));

    $result file_get_contents($url,false$stream_context); 
    Inoltre dovresti anche vedere se non va in timeout anche lo script php, che puoi modificare (se ti è permesso) con la set_time_limit()

  4. #4
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Quale sarebbe l'eccezione lanciata da Java?

    Hai già pensato ad un timeout?
    appena posso ti posto l'eccezione, non ho il pc sotto mano!

    Quote Originariamente inviata da boots Visualizza il messaggio
    la file_get_contents dovrebbe avere un timeout definito nel php.ini (default_socket_timeout) che di default è di 60 secondi.
    Potresti crearti uno stream context ed impostare un timeout maggiore:

    Codice PHP:
    $stream_context stream_context_create(array('http'=>
        array(
            
    'timeout' => 120  // 2 Minuti
        
    )
    ));

    $result file_get_contents($url,false$stream_context); 
    Inoltre dovresti anche vedere se non va in timeout anche lo script php, che puoi modificare (se ti è permesso) con la set_time_limit()
    il server è in casa, quindi posso fare le modifiche che voglio.
    avevo provato con set_time_limit(), ma evidentemente da solo non era bastato.
    domani appena arrivo in ufficio faccio subito un test e vi dico.

    intanto grazie!!

  5. #5
    allora, l'errore che mi da java è questo:
    codice:
    lug 18, 2016 8:45:03 AM org.glassfish.jersey.server.ServerRuntime$Responder writeResponse
    GRAVE: An I/O error has occurred while writing a response message entity to the container output stream.
    org.glassfish.jersey.server.internal.process.MappableException: java.io.IOException: Pipe interrotta
        at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1128)
        at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:664)
        at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:421)
        at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:411)
        at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:308)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110)
        at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:381)
        at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:219)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.IOException: Pipe interrotta
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
        at sun.nio.ch.IOUtil.write(IOUtil.java:51)
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
        at org.glassfish.grizzly.nio.transport.TCPNIOUtils.flushByteBuffer(TCPNIOUtils.java:149)
        at org.glassfish.grizzly.nio.transport.TCPNIOUtils.writeCompositeBuffer(TCPNIOUtils.java:87)
        at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:112)
        at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:91)
        at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:261)
        at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:170)
        at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:70)
        at org.glassfish.grizzly.nio.transport.TCPNIOTransportFilter.handleWrite(TCPNIOTransportFilter.java:126)
        at org.glassfish.grizzly.filterchain.TransportFilter.handleWrite(TransportFilter.java:191)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
        at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:848)
        at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:817)
        at org.glassfish.grizzly.http.io.OutputBuffer.flushBuffer(OutputBuffer.java:1024)
        at org.glassfish.grizzly.http.io.OutputBuffer.write(OutputBuffer.java:680)
        at org.glassfish.grizzly.http.server.NIOOutputStreamImpl.write(NIOOutputStreamImpl.java:83)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:229)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$UnCloseableOutputStream.write(WriterInterceptorExecutor.java:299)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:1862)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeNumber(UTF8JsonGenerator.java:816)
        at com.fasterxml.jackson.databind.ser.std.NumberSerializers$IntegerSerializer.serialize(NumberSerializers.java:97)
        at com.fasterxml.jackson.databind.ser.std.NumberSerializers$IntegerSerializer.serialize(NumberSerializers.java:87)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
        at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
        at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContentsUsing(IndexedListSerializer.java:124)
        at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:69)
        at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21)
        at com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:237)
        at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:612)
        at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:635)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
        at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
        at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86)
        ... 19 more
    però preciso che l'errore lo vedo solo perchè me lo da netbeans (anche il WS è in fase di test), perchè in verità il programma continua a funzionare perfettamente.
    se lo reinterrogo da browser, o interrogo un altro servizio, tutto funziona.
    quindi il programma in Java non si blocca.

    lato PHP, dove penso ci sia il problema, ho fatto così:
    Codice PHP:
    set_time_limit(0);

    include_once 
    './lib/costanti_file.php';

    $url '...............';
    $streamContext stream_context_create(array(
        
    'http' => array(
            
    'timeout' => 300  // 5 Minuti
        
    ))
    );
    $result file_get_contents($urlfalse$streamContext);
    $json json_decode($resulttrue);
    var_dump($json); 
    così pare funzionare.
    ma con lo stream_context_create.
    il solo set_time_limit non basta!

    grazie per la dritta!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.